Linux上的Ada程序:由于缺少文件而导致SIGSEGV?

时间:2012-04-12 00:07:10

标签: linux ubuntu ada gnat

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

gnatmake -O3 myprogram -bargs -static

当我在Ubuntu机器上运行该程序时,它工作正常。但是在另一台机器(Linux webserver)上,当我尝试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 +++

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

3 个答案:

答案 0 :(得分:4)

  

这是什么意思?

这意味着您的程序尝试取消引用NULL指针并死于SIGSEGV

  

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

不:这些文件不存在是完全正常的,而你的问题与它们无关。

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

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

    如果是这样,并且如果您的构建和Web服务器上安装的glibc版本不同,那么正好您的问题。不要忽略此类警告(并且不要将可执行文件与-static标记链接起来。)

  3. 更新

      

    是否可以只将缺少的libgnat包含在程序中?

    有可能:您想要做的是安排最终的链接行如下所示:

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

    我不知道如何使用gnatmake实现这一目标。

    另一种可能更简单的替代方案:您是否考虑在服务器上安装libgnat-3.4.so.1

答案 1 :(得分:2)

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

  1. 我可以建议您运行 ldd ,这会显示依赖项
  2. 修复依赖项,如果不起作用
  3. 如果重新编译它,请使用-g标志稍后进行调试
  4. 如果它还没有运行,请使用gdb并运行它,如果它退出SIGSEV类型在哪里
  5. 备注:始终确保CPU“完全”相同,否则在新机器上重新编译它并将可执行文件作为二进制文件传输

    The Man Page which is nice to be read

答案 2 :(得分:1)

另外请记住,将在一台Linux机器(Ubuntu 5.4)上编译的程序移动到另一台机器(Web服务器)可能具有不同的文件依赖性。特别是如果它们基于不同的发行版。以下是ld.so. *文件的说明:scroll to the bottom

尝试jimw的建议并在网络服务器上构建程序。 GNAT 3.4是旧版本,因此可能无法在Web服务器上使用。还要记住,雇用俄罗斯人的建议 - 不要使用-static标志。您可以尝试在没有-static标志的情况下在Ubuntu上重新编译您的程序,并在Web服务器上运行新版本,但这可能无法解决错误。

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