Ada program on Linux: SIGSEGV due to missing file?
ada, gnat, linux, ubuntu
Solution
What does that mean?
It means that your program tried to dereference a `NULL` pointer and died with `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?
No: it is perfectly normal for these files to not exist, and your problem has nothing to with them.
- The tool to debug problems like this is `gdb`. `strace` is only rarely useful for such debugging.
Contrary to popular belief, fully-static executables (as the one you built) are less portable on Linux, then dynamically-linked ones. In particular, you probably got warnings at link time, similar to this one:
`Using 'initgroups' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking`
If so, and if versions of glibc installed on your build and webserver machines are different, then that's precisely your problem. Don't ignore such warnings (and don't link your executables with `-static` flag).
Update:
Is it possible to include only the missing libgnat into the program?
It may be possible: what you want to do is arrange for the final link line to look like this:
gcc ... -Wl,-Bstatic -lgnat -Wl,-Bdynamic ...
I don't know how to achieve that with `gnatmake`.
Another, perhaps simpler, alternative: have you considered installing `libgnat-3.4.so.1` on the server?
Problem
I've compiled an Ada program for Linux on Ubuntu 5.4 (GNAT 3.4) using the following command: ``` gnatmake -O3 myprogram -bargs -static ``` When I run the program on the Ubuntu machine then, it works fine. But on another machine (Linux webserver), I get the following error message when I try `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 +++ ``` What does that mean? Do I understand it correctly that the program is unable to run because two files (ld.so.nohwcap and ld.so.preload) are missing? How can I avoid this error? Is there any possibility to include these files into the program while compiling?