_dl_runtime_resolve() 中的分段错误
Segmentation fault in _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
声明在那里。
LdapDN
是char *
的,不是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);
}
}
}
_dl_fixup
中的崩溃通常意味着您已经损坏了运行时加载程序的状态。
最常见的两个原因是:
- 堆损坏(溢出)或
glibc
本身的不匹配部分。
如果您没有设置例如 LD_LIBRARY_PATH
指向一个非标准glibc
,那么我们可以忘记原因#2。
对于#1,在Valgrind下运行程序,并确保它没有检测到错误。
如果实际上没有,请使用 disas
和 info registers
GDB 命令,使用它们的输出更新您的问题,您可能会收到其他帮助。
这是GOT表的问题。 _dl_runtime_resolve - 当动态库调用某些函数时更改 GOT(全局偏移表)的过程。下次使用更改的GOT条目。当来自动态库的函数(例如来自 libc.so 的 printf())首次在代码中调用时:
- 转到 PLT(程序查找表)。PLT 是一个蹦床,它从 GOT 获取被调用函数的正确地址。
- 从 PLT 转到 GOT
- 返回PLT
- 呼叫_dl_runtime_resolve
- 将实际函数跳转地址存储到 GOT
- 从动态库调用函数
第二次函数调用是:
- 转到 PLT
- 转到 GOT
- GOT可以从动态库直接跳转到函数地址。GOT是对再次调用的函数的引用,而无需快速通过_dl_runtime_resolve。
我在这里看到内存泄漏:
你基本上失去了你以前的字符串LdapDN
当你这样做时
if ( pos != std::string::npos ) {
ldapDN = ldapDN.substr(pos);
LdapDN = (char *)ldapDN.c_str();
//getEntityPathFromLdapDn(ldapDN.c_str(), epath, domid);
}
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?