我试图为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
崩溃
[email protected]:~/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
[email protected]:~/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 ([email protected]=0x6e68e0 <buff> "", sin=0x7fffffffd440,
numeric=<optimized out>, [email protected]=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 64bit上运行正常。我认为16.04可能会有一个bug。
是的,有一些警告。这可以修复吗?这个想法是从外部磁盘运行这些工具,而不用接触他们将要运行的系统。顺便说一句,崩溃发生在我正在建立的同一个系统上。还没有在另一台电脑上试过。 – user1781482
@ user1781482不希望在* same *系统上崩溃。编辑您的帖子以显示来自GDB的崩溃堆栈跟踪。 –
我不知道如何查看崩溃堆栈跟踪。我不是专业人士。我怎么做?谢谢。 – user1781482