静态链接的二进制文件 - 分割故障



我正在尝试为Net-Tools-1.60构建静态二进制文件,因此它们可以在任何系统上自行运行。我从SourceForge下载了净工具的来源,并应用了3个补丁。然后,我用make SHARED=0 CC='gcc -static'成功编译。编译的二进制文件显示为"静态链接"和一些工作,但有些则获得了"分段故障"。主要是 ARP 路由不起作用。我也尝试了LDFLAGS="--static" make -j 4,但是由此产生的二进制文件仍显示"动态链接"。

这是在Ubuntu 16.04上使用4.4.0-64代内核。有什么想法如何工作?

警告

requires at runtime the shared libraries from the glibc version used for linking
/home/user/Desktop/net-tools-1.60/lib/inet.c:404: warning: Using 'setprotoent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/user/Desktop/net-tools-1.60/lib/inet.c:414: warning: Using 'endprotoent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/user/Desktop/net-tools-1.60/lib/inet.c:386: warning: Using 'getservent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/user/Desktop/net-tools-1.60/lib/inet.c:385: warning: Using 'setservent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/user/Desktop/net-tools-1.60/lib/inet.c:403: warning: Using 'endservent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

崩溃

user@ubuntu:~/Desktop/net-tools-1.60$ file arp
arp: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=fc19dbe5121b2a3eb7aee3e6e0fc8de7490d6263, not stripped
user@ubuntu:~/Desktop/net-tools-1.60$ ./arp 
Segmentation fault (core dumped)

GDB

(gdb) run
Starting program: /home/user/Desktop/net-tools-1.60/arp 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) where
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff6c83fa9 in __pthread_initialize_minimal_internal () at nptl-init.c:471
#2  0x00007ffff6c83589 in _init () at ../sysdeps/x86_64/crti.S:72
#3  0x00007ffff70a4670 in ?? () from /lib/x86_64-linux-gnu/libnss_myhostname.so.2
#4  0x00000000004acd5a in call_init.part ()
#5  0x00000000004acf15 in _dl_init ()
#6  0x00000000004999a5 in dl_open_worker ()
#7  0x0000000000497164 in _dl_catch_error ()
#8  0x0000000000499309 in _dl_open ()
#9  0x00000000004563d2 in do_dlopen ()
#10 0x0000000000497164 in _dl_catch_error ()
#11 0x00000000004565be in __libc_dlopen_mode ()
#12 0x0000000000451e6d in __nss_next2 ()
#13 0x000000000044dbac in gethostbyaddr_r ()
#14 0x000000000044d9be in gethostbyaddr ()
#15 0x00000000004031f2 in INET_rresolve (name=name@entry=0x6e68e0 <buff> "", sin=0x7fffffffd440, 
    numeric=<optimized out>, netmask=netmask@entry=4294967040, len=128) at inet.c:200
#16 0x0000000000403354 in INET_sprint (sap=<optimized out>, numeric=<optimized out>) at inet.c:246
#17 0x0000000000401877 in arp_show (name=0x0) at arp.c:581
#18 0x0000000000400b53 in main (argc=1, argv=0x7fffffffe008) at arp.c:768
(gdb)

更新因此,我刚刚在旧的Ubuntu 11.10 32位上构建了工具。由此产生的二进制文件在我的Ubuntu 16.04 64位上正常工作。我认为16.04中可能有一个错误。

编译的二进制文件显示为"静态链接"和一些工作,但有些则获得"分割故障"

这是预期结果(假设崩溃发生在系统以外的系统上发生)。

与普遍的信念相反, linux上的静态库比动态链接的便于便携。

您应该收到这样的链接时间警告:

warning: Using 'getgrnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

解释。

更新:

在构建程序的同一系统上,撞车事故不会被期望。此崩溃看起来像一个glibc错误。

最终结果是相同的:不要静态链接;没有好的会出来。

相关内容

  • 没有找到相关文章

最新更新