静态链接libc

问题描述 投票:0回答:1

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

  1. -static添加到上面的target_link_options
  2. [set(CMAKE_EXE_LINKER_FLAGS "-static")在调用add_executable(my_executable ...)之前
  3. -static添加到target_link_libraries(my_executable lib1 lib2 -static)

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

... -Wl,-Bdynamic -ldl -lrt -lm -lpthread

我相信这是我的问题:我想摆脱那个-Bdynamic。我想念什么?此-Bdynamic来自我的依赖项之一吗?我从源头将它们全部构建为静态(.a)库,那么它们如何动态链接libc?还是在构建它们时需要修补它们以添加-static

cmake libc
1个回答
0
投票
对于我要静态链接的目标可执行文件:

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标头,并且没有它,就没有动态二进制文件(使用musl)。
  • 事实证明,检查二进制文件是否静态链接不是那么简单:-)。
© www.soinside.com 2019 - 2024. All rights reserved.