1

作为我正在修改的 Cobol 程序的一部分,需要调用 stat 函数来检索文件的详细信息。这是在 Linux 7.6 中。但是当我运行程序时,我得到了错误

加载错误:文件'stat'错误代码:173,pc = C6,call = 1,seg = 0 173在驱动器/目录中找不到调用的程序文件

如果我从命令行对文件使用 stat ,它可以工作并检索详细信息。我不明白为什么 cobol 调用 stat 失败。

我在 /usr/lib 中的 .so 文件中检查了 stat。可以在 libc_nonshared.a 中找到 stat

还尝试在更改 stat 结构后将调用从 stat 更改为 stat64。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在驱动器/目录中找不到调用的程序文件

4

2 回答 2

1

I was able to get this to run but only after first piecing together the structure in COBOL and. after forcing a static call, linking in the system lib's when compiling.

Here's what I have from a program named 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

Compile with the -L switch.

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

PS. callstat1 worked as well but it uses C module wrappers to make the system calls to stat and ctime.

于 2019-08-08T13:19:40.677 回答
0

在我的机器上,stat 符号不存在,替代存在。

我怀疑这是因为“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
于 2019-08-27T21:44:01.577 回答