c++ - 与动态库链接导致的可执行运行时崩溃

标签 c++ c linux gcc ld

堆栈:使用 GNU 工具编译和链接的 MIPS、Linux、C、C++(针对 MIPS 在 x86 上构建)

公平警告:我是 C、C++ 新手,请随意提出任何可能显而易见的建议,因为我可能还没有尝试过。

我能够构建动态链接到库 (live555) 的可执行文件,如果我静态链接到它,一切正常,但是当我尝试动态链接可执行文件时,它会在运行时崩溃。为了确认我正在正确构建 .so 文件,我还尝试构建其他可执行文件(live555 附带的测试工具)以动态链接这些 .so 库,这些工具工作正常。

链接/构建似乎工作正常,在构建过程中没有抛出任何错误或警告。我可以使用 readelf -d 检查崩溃的可执行文件并清楚地看到 .so 引用。我还可以在可执行文件的 MIPS 系统上运行 ldd,库似乎加载正常,strace 输出也显示这些库正在加载。不幸的是,strace 输出并没有真正为我提供任何现场信息,我已经与熟悉该系统的其他人交谈过,他们不确定问题出在哪里。

只是在寻找想法和工具来尝试,如果有人有任何想法我会采纳它们!

感谢阅读

最佳答案

此处信息不足,无法开始深入进行故障排除。开始调试的一些想法,从最少到最耗时:

  1. 在可执行文件上运行 ldd 后,检查从中加载该库的路径,确保该库是您编译/链接的版本。简单的方法是获取目标和主机上的 MD5 哈希,确保它们相同。
    • 同时检查以确保您没有安装该库的多个实例
    • 仔细检查您图书馆的别名,确保它们指向同一个地方
  2. 尝试启用故障转储生成 $> ulimit -c unlimited,运行 gdb 或 DDD,加载故障转储并检查您的环境。
  3. 检查您的 CFLAGS,可能正如@YannRamin 所说,您需要 -fPIC 才能实现 MIPS。您可以运行 make -n 来查看您的二进制文件是如何生成的。
  4. 检查目标上的 LDPATH env 并确保它是合理的;顺便说一句,空的很好。
  5. 在编译/链接期间检查您的LDFLAGS。您可能需要运行 make -n,查找 gcc 命令或 collect 命令,然后复制粘贴整行并添加 --verbose 到最后,这样您就可以准确地看到链接器在做什么。您可能需要修复源文件/目标文件的路径,具体取决于构建系统的设置方式。

我们的想法是尝试消除潜在的问题,例如:

  • 错误的库版本:安装与编译
  • 多个位置/错误的别名
  • 编译/链接时的符号污染
  • 许多其他

你很幸运,你安装了 Linux,所以应该相当容易,只是可能会耗费时间。

关于c++ - 与动态库链接导致的可执行运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707918/

相关文章:

C++ 限制语义

c++ - 无法使用 FindWindowEx 函数找到子窗口

c++ - volatile 不适合任何范式

c - 如何从文件中读取指向整数指针的指针?

linux - 如何使用函数并将其变量传递给 linux 驱动程序 LM70 中定义的用户应用程序?

c++ - 初始化我的 std::map

c++ - 为什么我的 C++ 移动构造函数没有被调用?

c++ - 是否可以像指向函数的指针一样将指向运算符的指针作为参数传递?

regex - sed 脚本扩展正则表达式

c - glibc的结构?