2017-08-22 68 views
0

我製作了test_program,它使用動態庫並作爲linux守護進程工作。當使用動態庫(dlopen)時,是否可以通過更改庫文件導致分段錯誤?

test_program包含一個代碼初始化過程。

dlopen(libtest.so);

通常情況下,終止與test_program SIGKILL不會導致段錯誤(我仔細檢查了!!)

但與覆蓋libtest.so文件(如cp libtest.so /lib64/libtest.so事業分割終止故障

庫文件意外覆蓋和文件實際上是相同的libtest.so(我是diffed)。

我會非常感激知道爲什麼分段錯誤發生時庫文件覆蓋。

感謝您閱讀並附上生成的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] 
+0

'男人dlclose'「從這些功能*錯誤,可以使用診斷dlerror獲得(3)*」 - 具體到你的問題,當'dlcose'叫什麼發生(也許是隱含的)並且文件不再存在? –

+0

@ DavidC.Rankin我試圖把dlerror放到dlclose調用的時候,但是文件的位置沒有改變。 –

回答

1

通常,終止與SIGKILL test_program不會引起 段錯誤(I雙重檢查!!)

SIGKILL不能被捕獲也不能被忽略並阻止任何f進一步的用戶空間代碼執行。這意味着它從來沒有導致分段錯誤。也許你的意思是SIGTERM。

但是,當與覆蓋libtest.so文件終止(例如,CP libtest.so /lib64/libtest.so)引起段故障。

您粘貼的回溯顯示了該進程試圖自行清理後的過程,因此無法收到SIGKILL。

庫文件不小心overwritted和文件實際上是 相同libtest.so(我是顯示差異)。

該文件可能相同,但在映射到進程的內存中不相同。 cp在文件上截斷並覆蓋內容「恢復」原始狀態。

即使保留修改後的狀態,截斷和完成寫入之間的時間窗口也會出現崩潰的可能性:要麼該區域沒有被文件支持(它給出了SIGBUS),要執行的代碼是尚未寫入,並且該區域只是歸零(即時SIGSEGV),或者該指令被部分寫入並且看起來是僞造的(SIGILL)。

TL;醫生不這樣做

+0

當文件被替換(截斷和重寫)時,通常發生的情況是私有映射的可寫數據區域被清除,並導致崩潰。這種失敗並不涉及競爭條件,因此更爲常見。 –