首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态链接libc

静态链接libc
EN

Stack Overflow用户
提问于 2020-05-14 13:54:47
回答 1查看 3.4K关注 0票数 2

我正在尝试用CMake 3.15制作一个静态的可执行文件。我构建在Alpine上(因此使用了musl),目前,我的可执行文件的ldd输出是:

代码语言:javascript
复制
# ldd my_executable
    /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fc6f65b3000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fc6f659f000)

我可以设置target_link_options(my_executable PRIVATE -static-libgcc -static-libstdc++),它们可以静态链接:

代码语言:javascript
复制
# ldd my_executable
    /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fc6f7977000)

但我无法让musl静态链接。我尝试过(使用干净的构建,以确保配置步骤从零开始):

在调用above.

  • set(CMAKE_EXE_LINKER_FLAGS "-static") add_executable(my_executable ...)

  • Adding -static之前,
  1. -static添加到target_link_options

当我在CMake模式下运行VERBOSE=1时,它总是以以下方式结束链接命令:

代码语言:javascript
复制
... -Wl,-Bdynamic -ldl -lrt -lm -lpthread

我相信这是我的问题:我想摆脱那个-Bdynamic。我遗漏了什么?这个-Bdynamic来自我的依赖项之一吗?我将它们全部构建为静态(.a)库,那么它们如何动态链接libc呢?或者,当我构建-static时,是否需要对它们进行修补以添加它们呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 08:51:09

正如KamilCuk的评论所暗示的那样,答案here似乎有解决方案。尽管如此,我并没有做完全相同的事情,所以我也会保留这个答案。

对于我希望静态链接的目标可执行文件:

代码语言:javascript
复制
add_executable(my_executable main.cpp)

我必须设置以下属性/选项:

代码语言:javascript
复制
set_target_properties(my_executable PROPERTIES LINK_SEARCH_START_STATIC ON)
set_target_properties(my_executable PROPERTIES LINK_SEARCH_END_STATIC ON)

target_link_options(my_executable PRIVATE -static-libgcc -static-libstdc++ -static)

一些注意事项:

  • LINK_SEARCH_*_STATIC对于从链接命令中删除-Bdynamic很有用。used).
  • ldd
  • I从未设法从链接命令中删除-ldl,但似乎dl最终没有得到链接(大概是因为used).
  • ldd不足以验证my_executable是静态链接的。readelf -l my_executable显示它没有INTERP头,目前没有动态二进制(使用musl)。
  • 检查二进制文件是否静态链接并不那么简单:-)。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61799147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档