Linux上的Ada程序:SIGSEGV由于缺less文件?

我使用以下命令在Ubuntu 5.4(GNAT 3.4)上为Linux编译了一个Ada程序:

gnatmake -O3 myprogram -bargs -static 

当我在Ubuntu机器上运行程序时,它工作正常。 但在另一台机器(Linuxnetworking服务器)上,当我尝试strace时,出现以下错误信息:

 execve("./myprogram", ["./myprogram"], [/* 15 vars */]) = 0 brk(0) = 0x811e000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f8000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76f7000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb76f7680, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 --- SIGSEGV (Segmentation fault) @ 0 (0) --- +++ killed by SIGSEGV +++ 

那是什么意思? 我是否正确地理解程序无法运行,因为缺less两个文件(ld.so.nohwcap和ld.so.preload)? 我怎样才能避免这个错误? 编译时是否有可能将这些文件包含到程序中?

那是什么意思?

这意味着你的程序试图解引用一个NULL指针,并用SIGSEGV

我是否正确地理解程序无法运行,因为缺少两个文件(ld.so.nohwcap和ld.so.preload)?

不:这些文件不存在是完全正常的,你的问题与他们没有任何关系。

  1. 调试这样的问题工具是gdbstrace对于这种调试只是很少有用的。
  2. 与流行的观点相反,完全静态的可执行文件(就像你所建立的那样)在Linux上是不易移植的,然后是动态链接的。 特别是,您可能在链接时收到警告,与此类似:

    Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

    如果是这样,并且如果您的版本和web服务器上安装的glibc版本不同,那么这正是您的问题。 不要忽略这样的警告(并且不要将你的可执行文件和-static标志关联起来)。

更新:

是否有可能只包含缺少的libgnat到程序中?

这可能是可能的:你想要做的是安排最后的链接线看起来像这样:

 gcc ... -Wl,-Bstatic -lgnat -Wl,-Bdynamic ... 

我不知道如何用gnatmake来实现。

另一个也许更简单的选择:你有没有考虑在服务器上安装libgnat-3.4.so.1

从strace中看到的输出是试图在库中链接的动态链接器

  1. 我可以推荐你运行ldd这会显示你的依赖关系
  2. 修复依赖关系,如果这不起作用
  3. 如果你重新编译它,使用-g标志来稍后调试它
  4. 如果它仍然没有运行使用gdb并运行它,如果它退出与SIGSEV类型在哪里

注意:一定要确保CPU“完全一样”,否则在新机器上重新编译它,并且将可执行文件作为二进制

男人页是很好的阅读

另外请记住,将在一台Linux机器(Ubuntu 5.4)上编译的程序移动到另一台(网络服务器)可能具有不同的文件依赖性。 特别是如果他们是基于不同的发行版。 这里是对ld.so. *文件的描述: 滚动到底部 。

尝试jimw的建议,并建立在网络服务器上的程序。 GNAT 3.4是一个较旧的版本,所以它可能无法在网络服务器上使用。 另外请记住,俄罗斯雇用的建议 – 不要使用-static标志。 你可以尝试在没有-static标志的情况下在Ubuntu上重新编译你的程序,并在网络服务器上运行新版本,但是这可能不能解决这个错误。

如果重新编译和/或编译在网络服务器上不起作用,你将不得不使用gdb来调试你的程序。 或者你可以在这里发布部分代码,看看是否有人可以帮助你。