如何使用gcc构建自包含的可执行文件?

时间:2015-10-23 09:27:54

标签: c++ linux gcc linker shared-libraries

为了进行一些编译器评估工作,我需要能够在当前Linux平台上使用最新版本的gcc / clang构建可执行文件,然后将这些可执行文件复制到较旧的Linux平台进行测试和基准测试。当然这不起作用,因为较旧的平台具有各种所需共享库的旧版本。到目前为止,我已经尝试过:

  • 将各种必需的.so库复制到目标系统并设置LD_LIBRARY_PATH以便它们被拾取 - 这会导致错误,例如:
  

./ foo:/lib64/libm.so.6:找不到版本`GLIBC_2.15'(./foo要求)

然后当通过添加更多.so文件来解决这些问题时,我最终得到:

  

ls:重定位错误:./ libc.so.6:符号_dl_find_dso_for_object,版本GLIBC_PRIVATE未在文件ld-linux-x86-64.so.2中定义,带有链接时间参考

  • 我还尝试在链接时使用-static,但是找不到各种库并且链接失败(可能是因为许多库仅以共享形式存在)

我在各种旧的(类似但不重复的)StackOverflow问题中找到了一个可能的解决方案(例如Compile shared library into a program?),但这种方法似乎非常复杂 - 它需要遵循所有库依赖关系并将它们转换为静态库。具有讽刺意味的是,这些解决方案中使用的工具显然只能作为闭源二进制文件使用。

这似乎是一个常见问题 - 否则人们如何分发仅二进制应用程序?我在这里错过了一个更简单的解决方案吗?

<小时/>

更新

我刚刚尝试了trial version of Magic Ermine,它的效果与宣传的一样。由于这只是一个短期要求,我可能会坚持使用此解决方案,但请参阅下面的评论以获取其他建议。另请参阅与Magic Ermine相同作者的免费工具statifier。我现在关闭这个问题作为重复,但留在这里是为了任何未来的访问者。

0 个答案:

没有答案