堆栈:使用 GNU 工具编译和链接的 MIPS、Linux、C、C++(针对 MIPS 在 x86 上构建)
公平警告:我是 C、C++ 新手,请随意提出任何可能显而易见的建议,因为我可能还没有尝试过。
我能够构建动态链接到库 (live555) 的可执行文件,如果我静态链接到它,一切正常,但是当我尝试动态链接可执行文件时,它会在运行时崩溃。为了确认我正在正确构建 .so 文件,我还尝试构建其他可执行文件(live555 附带的测试工具)以动态链接这些 .so 库,这些工具工作正常。
链接/构建似乎工作正常,在构建过程中没有抛出任何错误或警告。我可以使用 readelf -d 检查崩溃的可执行文件并清楚地看到 .so 引用。我还可以在可执行文件的 MIPS 系统上运行 ldd,库似乎加载正常,strace 输出也显示这些库正在加载。不幸的是,strace 输出并没有真正为我提供任何现场信息,我已经与熟悉该系统的其他人交谈过,他们不确定问题出在哪里。
只是在寻找想法和工具来尝试,如果有人有任何想法我会采纳它们!
感谢阅读
最佳答案
此处信息不足,无法开始深入进行故障排除。开始调试的一些想法,从最少到最耗时:
- 在可执行文件上运行
ldd
后,检查从中加载该库的路径,确保该库是您编译/链接的版本。简单的方法是获取目标和主机上的MD5
哈希,确保它们相同。- 同时检查以确保您没有安装该库的多个实例
- 仔细检查您图书馆的别名,确保它们指向同一个地方
- 尝试启用故障转储生成
$> ulimit -c unlimited
,运行 gdb 或 DDD,加载故障转储并检查您的环境。 - 检查您的 CFLAGS,可能正如@YannRamin 所说,您需要 -fPIC 才能实现 MIPS。您可以运行
make -n
来查看您的二进制文件是如何生成的。 - 检查目标上的
LDPATH
env 并确保它是合理的;顺便说一句,空的很好。 - 在编译/链接期间检查您的
LDFLAGS
。您可能需要运行make -n
,查找gcc
命令或collect
命令,然后复制粘贴整行并添加--verbose
到最后,这样您就可以准确地看到链接器在做什么。您可能需要修复源文件/目标文件的路径,具体取决于构建系统的设置方式。
我们的想法是尝试消除潜在的问题,例如:
- 错误的库版本:安装与编译
- 多个位置/错误的别名
- 编译/链接时的符号污染
- 许多其他
你很幸运,你安装了 Linux,所以应该相当容易,只是可能会耗费时间。
关于c++ - 与动态库链接导致的可执行运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707918/