使用动态库(dlopen)时,是否可能通过更改库文件导致分段错误?

时间:2017-08-22 00:27:12

标签: c linux gcc shared-libraries

我使用动态库并作为linux守护进程使用test_program

test_program包含代码初始化过程。

dlopen(libtest.so);

通常情况下,使用sigkill终止test_program不会导致分段错误(我仔细检查!!)

但是当被覆盖的libtest.so文件终止时(例如cp libtest.so /lib64/libtest.so会导致细分错误

图书馆文件被意外覆盖,文件实际上相同libtest.so (我被分歧了。)

我非常感谢知道为什么在覆盖库文件时发生分段错误。

感谢阅读和生成的corefile和dmesg的附加Backtrace,如果您需要更多信息,请告诉我。

回溯(分开):

#0  0x00007fd2c7668118 in ?? () from /lib64/libgcc_s.so.1
#1  0x00007fd2c7669019 in _Unwind_Backtrace () from /lib64/libgcc_s.so.1
#2  0x00007fd2c73a2186 in backtrace () from /lib64/libc.so.6
#3  0x000000000050fda8 in print_trace (sig=11, siginfo=0x7fff87da5770, context=<optimized out>) at sighandler.c:239
#4  <signal handler called>
#5  0x0000000000018219 in ?? ()
#6  0x00007fd2c9c47a1a in _dl_fini () from /lib64/ld-linux-x86-64.so.2
#7  0x00007fd2c72d0e69 in __run_exit_handlers () from /lib64/libc.so.6
#8  0x00007fd2c72d0eb5 in exit () from /lib64/libc.so.6
#9  0x000000000050d655 in end_signal (signo=<optimized out>) at 
#10 <signal handler called>test_program.c:103

dmesg的:

test_program[11817]: segfault at 18219 ip 00007fd2c7668118 sp 00007fff87da4f40 error 4 in libgcc_s-4.8.5-20150702.so.1[7fd2c7659000+15000]

1 个答案:

答案 0 :(得分:1)

  

通常,使用sigkill终止test_program不会导致   分段错误(我仔细检查!!)

无法捕获或忽略SIGKILL,并阻止任何进一步的用户空间代码执行。这意味着它从不导致分段错误。也许你的意思是SIGTERM。

  

但是当用覆盖的libtest.so文件终止时(例如cp libtest.so)   /lib64/libtest.so)导致分段错误。

您粘贴的非常回溯显示了进程尝试自行清理的方式,因此无法收到SIGKILL。

  

库文件被意外覆盖,实际上是文件   同样的libtest.so(我很沮丧)。

文件可能相同,但在映射到进程的内存中不相同。 cp对文件进行截断并覆盖内容“恢复”原始状态。

即使要保留修改后的状态,截断和完成写入之间的时间窗口也会出现崩溃的可能性:要么该区域没有文件支持(给SIGBUS),要执行的代码不是写了,区域刚刚归零(即时SIGSEGV),或者指令部分写入并且看起来很伪(SIGILL)。

tl;博士不这样做