Reputation: 31489
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?
Upvotes: 3
Views: 1663
Reputation: 213556
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.
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?
Upvotes: 4
Reputation: 928
The Output you see from strace is the dynamic linker trying to link in libraries
Side Note: Always make sure the CPU is "exactly" the same, otherwise recompile it on the new machine and that you transfer the executable as binary
The Man Page which is nice to be read
Upvotes: 2
Reputation: 27
Also keep in mind that moving a program compiled on one Linux machine (Ubuntu 5.4) to another (the webserver) may have different file dependencies. Especially if they're based on different distros. Here is a description of the ld.so.* files: scroll to the bottom.
Try jimw's suggestion and build the program on the webserver. GNAT 3.4 is an older version, so it may not be available for use on the webserver. Also keep in mind, Employed Russian's advise - don't use the -static
flag. You can try and recompile your program on Ubuntu without the -static
flag and run the new version on the webserver, but this may not solve the error.
If the recompile and/or compiling it on the webserver doesn't work, you'll have to use gdb to debug your program. Or you can post part of the code here and see if someone can help you.
Upvotes: 1