2012-05-14 54 views
3

我在代碼中做簡單的字符串操作,我得到一個分段錯誤。我無法得到確切的問題。 請看看有人能幫忙。_dl_runtime_resolve()中的分段錯誤

核心的回溯是

(gdb) bt 
#0 0x00007f595dee41da in _dl_fixup() from /lib64/ld-linux-x86-64.so.2 
#1 0x00007f595deea105 in _dl_runtime_resolve() from /lib64/ld-linux-x86-64.so.2 
#2 0x0000000000401d04 in getNodeInfo (node=0x7fffbfb4ba83 "TCU-0") 
    at hwdetails.cpp:294 
#3 0x0000000000402178 in main (argc=3, argv=0x7fffbfb4aef8) 
    at hwdetails.cpp:369 

線294崩潰即將在cout說法是存在的。
LdapDNchar *而不是NULL

if (Epath && (Epath->Entry[0].EntityType == SAHPI_ENT_UNSPECIFIED || 
     Epath->Entry[0].EntityType == SAHPI_ENT_ROOT)) { 
     // nothing is mapped. Degrade the ldap dn path to slot. 
     if(LdapDN){ 
      std::cout << "LdapDN " << LdapDN << std::endl; 
     } 
     std::string ldapDN; 
     ldapDN = LdapDN; 
     std::string slot = LDAP_PIU_ID; 
     if (ldapDN.compare(0, slot.length(), slot) != 0) { 
      size_t pos = ldapDN.find(slot); 
      if (pos != std::string::npos) { 
       ldapDN = ldapDN.substr(pos); 
       LdapDN = (char *)ldapDN.c_str(); 
       //getEntityPathFromLdapDn(ldapDN.c_str(), epath, domid); 
      } 
     } 
    } 
+0

它運行什麼操作系統?你正在使用的編譯選項是什麼? –

回答

7

_dl_fixup中的崩潰通常意味着您已損壞運行時加載程序的狀態。

兩個最常見的原因是:

  1. 堆損壞(溢)或本身glibc
  2. 不匹配的部件。

如果您未設置例如LD_LIBRARY_PATH指向一個非標準的glibc,那麼我們可以忘記理由#2。

對於#1,在Valgrind下運行您的程序,並確保它沒有檢測到錯誤。

如果實際上沒有,請使用disasinfo registers GDB命令,使用它們的輸出更新您的問題,並且您可能會收到其他幫助。

1

我看到內存泄漏的位置:

你基本上是丟失以前的字符串LdapDN當你做

if (pos != std::string::npos) { 
      ldapDN = ldapDN.substr(pos); 
      LdapDN = (char *)ldapDN.c_str(); 
      //getEntityPathFromLdapDn(ldapDN.c_str(), epath, domid); 
     } 
0

這是GOT表的問題。 _dl_runtime_resolve - 當動態庫調用第一次使用某個函數時,它會更改GOT(全局偏移量表)。在下次使用更改的GOT條目時。 當你的代碼第一時間的函數(從libc.so例如printf()函數)的動態庫調用的:

  1. 轉到PLT(程序查找表)。 PLT是一個蹦牀,可以從GOT獲取正在調用的函數的正確地址。
  2. 從PLT轉到GOT
  3. 返回PLT
  4. 呼叫_dl_runtime_resolve
    • 店實際函數跳轉地址,GOT從動態庫

第二次功能

  • 通話功能致電:

    1. 轉到PLT
    2. 轉到GOT
    3. GOT有直接跳轉到從動態庫函數的地址。 GOT是對再次調用的函數的引用,而不需要通過_dl_runtime_resolve fast。
  • +0

    「這是GOT表的問題」 - 您可能是對的,或者您可能錯了(在'_dl_runtime_resolve'中有崩潰的其他可能原因很多)。您沒有提供任何證據來支持您的說法,並且您對懶惰PLT解析過程中實際發生的情況的描述在許多細節上都是錯誤的,對於不熟悉它的任何人都沒有意義。 –