системная функция stat() не работает в Linux 7.6

Как часть программы Cobol, которую я модифицирую, функция stat должна быть вызвана для получения сведений о файле. Это в линукс 7.6. Но когда я запускаю программу, я получаю ошибку

Ошибка загрузки: файл 'stat', код ошибки: 173, pc = C6, call = 1, seg = 0 173 Вызванный программный файл не найден на диске/каталоге

Если я использую stat для файла из командной строки, он работает, и детали извлекаются. Я не понимаю, почему вызов stat не работает из cobol.

Я проверил статистику в файлах .so в /usr/lib. Можно найти статистику в libc_nonshared.a

Также пытался изменить вызов со стата на стат64 после изменения структуры стата. stat64 тоже выдает ту же ошибку.

Кто-нибудь еще сталкивался с этой проблемой. Любые указатели для продвижения вперед будут очень полезны.

       R0001.
          DISPLAY 'Program STARTED'
          ACCEPT WS-FILENAME2 FROM COMMAND-LINE
          MOVE 00025  TO FCD-NAME-LENGTH
          MOVE x'00'                 TO WS-FILENAME2(FCD-NAME-LENGTH:1)
          DISPLAY 'FILENAME : ' WS-FILENAME2
          CALL 'stat' USING WS-FILENAME2
                            ST-BUF
               RETURNING WS-RETURN-CODE.
          DISPLAY 'STAT CALL COMPLETE'
          DISPLAY 'RETURN CODE: ' WS-RETURN-CODE
          IF WS-RETURN-CODE NOT = ZERO
             SET GNIO-RC-ERR-DATEXT TO TRUE
             GO TO R0099
          END-IF.
          DISPLAY 'DEVICE VALUE : ' ST-DEV-LINUX
          DISPLAY 'INODE VALUE  : ' ST-INO64-LINUX
          DISPLAY 'ATIME        : ' ST-ATIME-LINUX
          DISPLAY 'CTIME        : ' ST-CTIME-LINUX
          DISPLAY 'MTIME        : ' ST-MTIME-LINUX
          DISPLAY 'SIZE64       : ' ST-SIZE64-LINUX
          DISPLAY 'BLOCKS64     : ' ST-BLOCKS64-LINUX.
       R0099.
          EXIT.
          STOP RUN.

Ошибка загрузки: файл 'stat', код ошибки: 173, pc = C6, call = 1, seg = 0 173 Вызванный программный файл не найден на диске/каталоге


person Sanyo Alexis    schedule 06.08.2019    source источник
comment
Попробуйте использовать полный путь, например. /usr/bin/stat.   -  person Roadowl    schedule 06.08.2019
comment
Все та же ошибка. Ошибка загрузки: файл '/usr/bin/stat', код ошибки: 253, pc = C6, call = 1, seg = 0 253 Не удается загрузить файл - неподдерживаемый формат   -  person Sanyo Alexis    schedule 06.08.2019
comment
Что type stat говорит из командной строки?   -  person Roadowl    schedule 06.08.2019
comment
На самом деле не та ошибка. Ранее это был файл, не найденный в каталоге. Теперь при использовании /usr/bin/stat выдается ошибка «Неподдерживаемый формат», как показано выше.   -  person Sanyo Alexis    schedule 06.08.2019
comment
Попробуйте запустить среду COBOL следующим образом: LD_LIBRARY_PATH=$COBDIR/lib:$LD_LIBRARY_PATH; export $LD_LIBRARY_PATH <cobol compiler>.   -  person Roadowl    schedule 06.08.2019
comment
stat хэшируется (/usr/bin/stat) Это то, что показывает тип stat   -  person Sanyo Alexis    schedule 06.08.2019
comment
Лучше всего установить LD_LIBRARY_PATH (как я прокомментировал выше) в файле ~/.bashrc. Таким образом, ваша среда настроена нормально. Другими словами, добавьте: LD_LIBRARY_PATH=$COBDIR/lib:$LD_LIBRARY_PATH; экспортируйте $LD_LIBRARY_PATH в свой .bashrc. После этого для текущего сеанса просто перезагрузите .bashrc: source ~/.bashrc.   -  person Roadowl    schedule 06.08.2019
comment
экспортируется LD_LIBRARY_PATH. Теперь значение равно /opt/microfocus/VisualCOBOL/lib:/opt/microfocus/VisualCOBOL/lib:/opt/microfocus/VisualCOBOL/lib::/usr/local/lib:/lib. К сожалению, такая же ошибка возникает после компиляции и повторного запуска программы.   -  person Sanyo Alexis    schedule 06.08.2019
comment
Это открытый кобол?   -  person Roadowl    schedule 06.08.2019
comment
Для других систем, чтобы сделать эквивалент настройки LD_LIBRARY_PATH, см. сюда: community.microfocus.com/t5/Net-Express-Server-Express/ (пожалуйста, обратите внимание, что они неразумно предшествуют различным примерам тире; тире НЕ является частью настройки).   -  person Roadowl    schedule 06.08.2019
comment
Это визуальный кобол. Проверил ссылку, которую вы дали, и это Linux, путь к библиотеке должен быть установлен, как вы упомянули. Отредактировал .bashrc и получил его. Но все так же. Я не понимаю, почему stat работает в командной строке, а не в коболе   -  person Sanyo Alexis    schedule 06.08.2019
comment
Это должны быть какие-то настройки среды. Пожалуйста, убедитесь, что когда вы выполняете echo $LD_LIBRARY_PATH из командной строки, он печатает настройку, как вы указали ранее. Кроме этого, проверьте и еще раз проверьте настройки среды для VC.   -  person Roadowl    schedule 06.08.2019
comment
Откуда взялись дополнительные :/usr/local/lib:/lib в вашем LD_LIBRARY_PATH? Попробуйте также добавить к нему :/lib64. По сути, когда вы выполняете ldd /usr/bin/stat, ваша программа (stat) должна иметь доступ ко всем упомянутым там каталогам.   -  person Roadowl    schedule 06.08.2019
comment
Линукса 7.6 нет. Вы можете заменить его на имя используемого вами дистрибутива...   -  person Murphy    schedule 06.08.2019
comment
Команда stat (вызывается из командной строки) и функция stat — совершенно разные вещи!   -  person Simon Sobisch    schedule 07.08.2019
comment
Поскольку вы хотите вызвать системную функцию C, я настоятельно рекомендую использовать статическое связывание. Для этого определите соответствующее соглашение о вызовах в специальных именах, таких как CALL-CONVENTION 8 IS STATIC, а затем выполните CALL STATIC 'stat' .... Если это сработает (не могу проверить, а документация минимальна), я воссоздам это как ответ.   -  person Simon Sobisch    schedule 07.08.2019
comment
Если я добавлю CALL-CONVENTION 8 IS STATIC, я получаю ошибки компиляции. 15 ДЕСЯТИЧНАЯ ЗАПЯТАЯ ЗАПЯТАЯ. * 71-S****************** ** ** ПРОЦЕДУРНЫЙ ОТДЕЛ отсутствует или неизвестен оператор 17 ВВОД-ВЫВОД ОТДЕЛ. * 82-S************ ** ** Заголовок раздела или раздела COBOL обнаружен в неправильном порядке 18 FILE-CONTROL   -  person Sanyo Alexis    schedule 07.08.2019
comment
Не удалось найти никакой помощи в документации microfcus по этому вопросу.   -  person Sanyo Alexis    schedule 07.08.2019
comment
Попробовал это - создал другую программу кобола только с вызовом статистики. Скомпилировал в исполняемый файл. Вызвал эту программу из моей исходной программы. Теперь ошибка другая...........Не удается загрузить файл - неподдерживаемый формат, не файл вызываемой программы не найден на диске/каталоге   -  person Sanyo Alexis    schedule 07.08.2019
comment
Я предлагаю отредактировать ваш вопрос, чтобы показать, что вы пробовали (по крайней мере, статическая часть соглашения о вызовах), позволить другим также просматривать это на предмет возможных проблем (и не рекомендовать то же самое, что вы уже пробовали - не все читают вопрос -комментарии [особенно, когда их так много] перед публикацией ответа).   -  person Simon Sobisch    schedule 12.08.2019


Ответы (2)


Я смог запустить это, но только после того, как сначала собрал структуру в COBOL и. после принудительного статического вызова, связывания системных библиотек при компиляции.

Вот что у меня есть из программы callstat2:

   01 ST-STRUCT.
      05  ST-DEV-LINUX             PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-INO64-LINUX           PIC 9(9) COMP-5.
      05                           pic x(4).
      05  ST-NLINK                 PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-MODE                  PIC 9(9) COMP-5.
      05  ST-UID                   PIC 9(9) COMP-5.
      05  ST-GUID                  PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-RDEV-LINUX            PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-SIZE                  PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-BLOCKSIZE-LINUX       PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-BLOCKS                PIC 9(9) COMP-5.
      05                           PIC X(4).
      05  ST-ATIME-LINUX           PIC 9(10) COMP-5.
      05                           PIC 9(10) COMP-5.
      05  ST-MTIME-LINUX           PIC 9(10) COMP-5.
      05                           PIC 9(10) COMP-5.
      05  ST-CTIME-LINUX           PIC 9(10) COMP-5.


      CALL STATIC 'stat' USING WS-FILENAME2
                               ST-STRUCT 
                     RETURNING WS-RETURN-CODE
      END-CALL

Скомпилируйте с ключом -L.

cobc -x  callstat2.cob -L/usr/lib/x86_64-linux-gnu

PS. callstat1 тоже работал, но он использует оболочки модулей C для выполнения системных вызовов stat и ctime.

person Jim Castro    schedule 08.08.2019
comment
Это GnuCOBOL, а не MicroFocus ;-) Я предполагаю, что это похоже (кроме вероятной необходимости определить CALL-CONVENTION в SPECIAL-NAMES), но я не знаю. - person Simon Sobisch; 12.08.2019

На моей машине символ статистики отсутствует, существует альтернатива.

Я подозреваю, что это связано с тем, что заголовки «C» используют макросы для перенаправления на другой символ.

     $ readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep " stat"   
 286: 000000000010ca10   108 FUNC    WEAK   DEFAULT   14 statvfs64@@GLIBC_2.2.5
 644: 000000000010ca10   108 FUNC    WEAK   DEFAULT   14 statvfs@@GLIBC_2.2.5
 870: 000000000010c6a0   486 FUNC    GLOBAL DEFAULT   14 statx@@GLIBC_2.28
1719: 000000000010c9b0    33 FUNC    WEAK   DEFAULT   14 statfs@@GLIBC_2.2.5
1930: 000000000010c9b0    33 FUNC    WEAK   DEFAULT   14 statfs64@@GLIBC_2.2.5


     $ readelf -s /lib/x86_64-linux-gnu/libc.so.6 | grep " printf"
 633: 0000000000062830   197 FUNC    GLOBAL DEFAULT   14 printf@@GLIBC_2.2.5
1578: 0000000000062750    28 FUNC    GLOBAL DEFAULT   14 printf_size_info@@GLIBC_2.2.5
2008: 0000000000061c90  2745 FUNC    GLOBAL DEFAULT   14 printf_size@@GLIBC_2.2.5
person Stephen Gennard    schedule 27.08.2019