c - 使用动态库(dlopen)时更改库文件是否可能导致段错误?

标签 c linux gcc shared-libraries

我被制作成test_program,使用动态库并作为 linux 守护进程工作。

test_program 包含一个代码初始化过程。

dlopen(libtest.so);

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

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

库文件不小心被覆盖了,其实是同一个libtest.so(我被diff了)

如果知道为什么库文件被覆盖时会发生段错误,我将不胜感激。

感谢阅读,我附上了生成的核心文件和 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]

最佳答案

Normally, terminates test_program with sigkill does not cause segmentation fault(I double checked!!)

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

But when terminated with overwritten libtest.so file(eg. cp libtest.so /lib64/libtest.so) cause segmentation fault.

您粘贴的回溯显示该进程如何尝试自行清理,因此它无法收到 SIGKILL。

the library file accidentally overwritted and the file is actually same libtest.so(I was diffed).

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

即使修改后的状态保持不变,截断和完成写入之间的时间窗口也存在崩溃的可能性:要么该区域不受文件支持(这会给出 SIGBUS),要么要执行的代码不存在尚未写入并且该区域刚刚清零(即时 SIGSEGV),或者指令已部分写入并且看起来是伪造的(SIGILL)。

tl;博士不要那样做

关于c - 使用动态库(dlopen)时更改库文件是否可能导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45807250/

相关文章:

c - 在新代码块中调用数组作为变量时的语法? [C]

c - 如何在 lua 中创建接受多个参数的 C 函数?

c - 如何更改罗马数字转换器中的4个重复数字?

c - TCP 套接字在 C 程序中失败并显示 "endpoint is not connected"

linux - Makefile共享库错误

c - 带有 "%"符号的表达式的 gcc 字符串化

拔下 Raspberry Pi 后导入模块时出现 Python EOFerror

linux - 对文件中具有指定模式最高值的行进行排序

c - 链接C代码时如何判断符号的定义位置

c - 使用 gcc 的中间 GIMPLE 格式