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

时间:2013-12-20 16:28:02

标签: c++ c linux gcc ld

Stack:MIPS,Linux,C,C ++使用GNU工具进行编译和链接(在x86上构建MIPS)

公平警告:我是C,C ++新手,随时可以提出任何可能显而易见的内容,因为我可能尚未尝试过。

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

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

只是寻找尝试的想法和工具,如果有人有任何想法我会适合他们!

感谢您阅读

1 个答案:

答案 0 :(得分:1)

此处没有足够的信息可以深入开展故障排除。一些开始调试的想法,从最少到最耗时:

  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添加到最后,这样您就可以确切地看到链接器正在做。您可能必须修复源/目标文件的路径,具体取决于构建系统的设置方式。
  6. 我们的想法是尝试消除潜在的问题,例如:

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

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

相关问题