2012-11-30 136 views
5

我有一個使用uclibc在MIPS CPU上運行的多進程程序,它使用gcc 4.5.3進行編譯。 其中一個進程(它是名稱「電視」)需要鏈接到一個共享庫(libtest.so),這也是我寫的。 「電視」過程是用C++編寫的,而libtest.so是用C語言編寫的。我也從libtest.so轉儲了elf頭文件,它有PIC和CPIC標誌集,所以我認爲庫的創建沒問題。如何調試加載共享庫

當我嘗試運行該程序時,除「電視」過程外,所有進程都可以正常啓動。沒有錯誤消息。當我使用ps來檢查它的狀態時,它已經成爲殭屍進程。

我曾嘗試以下

  1. 如果我從聯工藝去除libtest.so,並刪除該libtest.so任何引用,「看電視」的過程可以在沒有任何問題運行。

  2. 如果我刪除了任何對libtest.so的引用,但在鏈接過程中保留libtest.so,「電視」過程仍然不會運行。

  3. 我試圖使用LD_DEBUG = all來調試,但它不能在我的電路板上工作,因爲沒有有效的輸出。

所以我猜想有一些錯誤,當ld嘗試加載libtest.so時,「電視」過程開始。但我不知道如何調試?我應該如何確定libtest.so的哪個部分導致問題?

任何建議是值得歡迎的。提前致謝。

+1

你試過'strace'嗎? – mattn

+2

嗯,非常有趣的問題。你似乎在控制libtest方面有巨大的優勢 - 所以你可以嘗試用一個簡單的過程(而不是電視)重現問題,然後慢慢地將所有東西從libtest中刪除,直到問題消失,然後重新添加,直到你可以查明問題(二進制搜索風格)。除非問題證明是可重現的*只有電視和未經修改的libtest.so,在這種情況下,祝你好運? – Cameron

+0

@mattn我已經使用strace並找出我正在獲取SIGBUS。現在我要試着找出這是什麼原因。非常感謝你的建議。 – SSC

回答

0

請確保這與您的API的外部C聲明缺失有關,這些聲明將被調用爲C函數。

+0

我確定這不是由於缺少extern「C」聲明,因爲鏈接器不會鏈接,因爲函數名將被C++編譯器更改。 – SSC

+0

你的libtest.so是用C編譯器編譯的,所以函數名不會被破壞。我想知道,如果你編譯你的電視應用程序時,如果你的頭文件導出libtest.so API沒有extern「C」聲明,C++編譯器將如何表現。 [參考](http://dsc.sun.com/solaris/articles/mixing.html#c_from_cpp) –

0

加載過程中出現錯誤。因此編寫最簡單的應用程序,加載您的庫並立即卸載並調試它。