gpt4 book ai didi

linux - Linux 上的 Ada 程序 : SIGSEGV due to missing file?

转载 作者:可可西里 更新时间:2023-11-01 11:44:19 25 4
gpt4 key购买 nike

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

最佳答案

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?

否:这些文件不存在是完全正常的,与您的问题无关。

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

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

    如果是这样,并且如果您的构建机器和网络服务器机器上安装的 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 - Linux 上的 Ada 程序 : SIGSEGV due to missing file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com