我使用以下命令在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)?我怎样才能避免这个错误?在编译时是否有可能将这些文件包含到程序中?

解决方法:


What does that mean?

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

Do I understand it correctly that the program is unable to run because two files (ld.so.nohwcap and ld.so.preload) are missing?

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

调试这样的问题的工具是gdb. strace对这种调试很少有用.
与流行的看法相反,完全静态的可执行文件(就像你构建的那样)在Linux上的可移植性较差,然后是动态链接的.特别是,你可能在链接时收到警告,类似于这个:

在静态链接的应用程序中使用“initgroups”需要在运行时使用glibc版本中用于链接的共享库

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

更新:

Is it possible to include only the missing libgnat into the program?

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

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

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

另一个,也许更简单的替代方案:你考虑过在服务器上安装libgnat-3.4.so.1吗?

标签: linux, ubuntu, gnat

相关文章推荐

添加新评论,含*的栏目为必填