我被要求使用动态库并作为linux守护进程工作。test_program
包含一个代码初始化过程。test_program
通常,使用sigkill终止dlopen(libtest.so);
不会导致分段错误(我重复检查了!!)
但是,当以覆盖文件(例如test_program
)终止时,会导致分段错误。
库文件意外地被重写,文件实际上是相同的(我是不同的)。
如果能知道为什么库文件被覆盖时会出现分段错误,我将不胜感激。
感谢您的阅读,我附上了生成的corefile和dmesg的回溯,所以如果您需要更多信息,请告诉我。
回溯(分开):
#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]
最佳答案
通常,用sigkill终止test_程序不会导致
分段错误(我重复检查了!!)
不能捕获或忽略SIGKILL并阻止任何进一步的用户空间代码执行。这意味着它不会导致分割错误。也许你是指SIGTERM。
但是当以覆盖libtest.so文件(例如cp libtest.so)终止时
/lib64/libtest.so)导致分段错误。
粘贴的回溯显示了进程如何在自身之后尝试清理,因此它不可能接收到SIGKILL。
库文件意外地被覆盖,而该文件实际上
同样的libtest。所以(我是不同的)。
文件可能相同,但映射到进程的内存中不同。cp对文件执行截断并覆盖内容“还原”原始状态。
即使修改后的状态保持不变,从截断到完成写入之间的时间窗口也会出现崩溃的可能性:要么该区域没有文件的支持(该文件提供了SIGBUS),要么待执行的代码尚未写入,并且该区域刚刚归零(instant SIGSEGV),要么指令部分写入,看起来像是假的(SIGILL)。
tl;博士不要那样做
关于c - 使用动态库(dlopen)时是否可以通过更改库文件来引起段错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45807250/