cmake - 静态链接 libc

先吐槽一下:不是因为公司要求,我坚决不用cmake。cmake真的很傻逼,傻逼小米。

cmake - 静态链接 libc
标签 cmake libc

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

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++),然后静态链接:

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 静态链接。我试过(使用干净的构建,以确保配置步骤从零开始):

将 -static 添加到上面的 target_link_options。
set(CMAKE_EXE_LINKER_FLAGS “-static”) 在调用 add_executable(my_executable …)
之前
将 -static 添加到 target_link_libraries(my_executable lib1 lib2 -static)
当我在 VERBOSE=1 模式下运行 CMake 时,它​​总是以以下方式结束链接命令:

… -Wl,-Bdynamic -ldl -lrt -lm -lpthread
我相信这是我的问题:我想摆脱那个-Bdynamic。我错过了什么?此 -Bdynamic 是否来 self 的依赖项之一?我将它们全部从源代码构建为静态 (.a) 库,那么它们如何动态链接 libc?或者我是否需要修补它们以在构建它们时添加 -static?

最佳答案

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

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

add_executable(my_executable main.cpp)
我必须设置以下属性/选项:

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。
我从未设法从链接命令中删除 -ldl,但似乎 dl 最终没有获得链接(大概是因为它未被使用)。<
ldd 不足以验证 my_executable 是静态链接的。 readelf -l my_executable 显示它没有 INTERP header ,并且目前没有它(使用 musl)的动态二进制文件。
事实证明,检查二进制文件是否静态链接并不是那么简单:-)。
关于cmake - 静态链接 libc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799147/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_kerneler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值