【发布时间】:2012-04-12 00:07:09
【问题描述】:
我使用以下命令在 Ubuntu 5.4 (GNAT 3.4) 上为 Linux 编译了 Ada 程序:
gnatmake -O3 myprogram -bargs -static
然后,当我在 Ubuntu 机器上运行该程序时,它运行良好。但是在另一台机器(Linux 网络服务器)上,当我尝试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)?我怎样才能避免这个错误?编译时是否有可能将这些文件包含到程序中?
【问题讨论】:
-
您看到的输出不一定(实际上可能不)意味着 segv 和丢失的文件之间存在联系。你会一直在 strace 中看到这种东西;这只是系统在寻找例如一个可能存在也可能不存在的预加载库。如果您的程序中有调试符号,gdb 是跟踪 segv 的更好工具。我已经很久没有调试 ADA 了,所以我不确定该怎么做。
-
另外,您是在网络服务器上构建程序,还是将二进制文件复制过来?如果是后者,请尝试在那里构建它。
-
我复制了二进制文件。但这是必要的,因为网络服务器上缺少 GNAT。而且我不允许在那里安装新软件包。