【问题标题】:Is it possible to cause segmentation fault by changing library file when using dynamic library(dlopen)?使用动态库(dlopen)时更改库文件是否可能导致分段错误?
【发布时间】:2017-08-22 00:27:12
【问题描述】:

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

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

dlopen(libtest.so);

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

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

库文件被意外覆盖,文件实际上是相同的libtest.so(我被区分了)。

我很高兴知道为什么在覆盖库文件时会发生分段错误。

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

【问题讨论】:

  • man dlclose "可以使用 dlerror(3) 诊断来自这些函数的错误" -- 针对您的问题,调用 dlcose 时会发生什么(可能是隐式) 并且文件不再存在?
  • @DavidC.Rankin 我尝试输入 dlerror 但是调用 dlclose 时出现段错误,并且文件的位置没有改变。

标签: c linux gcc shared-libraries


【解决方案1】:

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

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

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

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

库文件被意外覆盖,文件实际上是 同样的 libtest.so(我被区分了)。

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

即使修改后的状态保持不变,截断和完成写入之间的时间窗口也存在崩溃的可能性:要么该区域没有由文件支持(提供 SIGBUS),要么要执行的代码不是尚未写入并且该区域只是归零(即时 SIGSEGV),或者指令已部分写入并且看起来是虚假的(SIGILL)。

tl;博士不要那样做

【讨论】:

  • 当文件被替换(截断和重写)时,通常会发生私有映射的可写数据区域被清除,这也会导致崩溃。这种故障不涉及竞态条件,因此更为常见。
猜你喜欢
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多