Link 静态 libc
Link libc statically
我正在尝试使用 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++)
,他们得到 link静态编辑:
# 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 link。我试过(使用干净的构建,以确保配置步骤从零开始):
- 将
-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 时,它总是以 linking 命令结束:
... -Wl,-Bdynamic -ldl -lrt -lm -lpthread
我认为这是我的问题:我想摆脱它 -Bdynamic
。我错过了什么?这是 -Bdynamic
来自我的依赖项之一吗?我将它们全部从源代码构建为静态 (.a
) 库,那么它们如何动态地 linking libc?或者我需要修补它们以在构建它们时添加 -static
吗?
正如 KamilCuk 的评论所暗示的那样,答案 here 似乎有解决方案。尽管如此,我并没有做完全相同的事情,因此我也会保留这个答案。
对于我想要的静态目标可执行文件linked:
add_executable(my_executable main.cpp)
我必须设置以下 properties/options:
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
有助于从 linking 命令中删除 -Bdynamic
。
- 我从来没有设法从 linking 命令中删除
-ldl
,但似乎 dl
最终没有得到 link(大概是因为它没有被使用) ).
ldd
不足以验证 my_executable
是静态 linked。 readelf -l my_executable
表明它没有 INTERP
header,并且目前没有动态二进制文件之类的东西(使用 musl)。
- 事实证明,检查二进制文件是否是静态 linked 或不是那么简单:-)。
我正在尝试使用 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++)
,他们得到 link静态编辑:
# 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 link。我试过(使用干净的构建,以确保配置步骤从零开始):
- 将
-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 时,它总是以 linking 命令结束:
... -Wl,-Bdynamic -ldl -lrt -lm -lpthread
我认为这是我的问题:我想摆脱它 -Bdynamic
。我错过了什么?这是 -Bdynamic
来自我的依赖项之一吗?我将它们全部从源代码构建为静态 (.a
) 库,那么它们如何动态地 linking libc?或者我需要修补它们以在构建它们时添加 -static
吗?
正如 KamilCuk 的评论所暗示的那样,答案 here 似乎有解决方案。尽管如此,我并没有做完全相同的事情,因此我也会保留这个答案。
对于我想要的静态目标可执行文件linked:
add_executable(my_executable main.cpp)
我必须设置以下 properties/options:
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
有助于从 linking 命令中删除-Bdynamic
。- 我从来没有设法从 linking 命令中删除
-ldl
,但似乎dl
最终没有得到 link(大概是因为它没有被使用) ). ldd
不足以验证my_executable
是静态 linked。readelf -l my_executable
表明它没有INTERP
header,并且目前没有动态二进制文件之类的东西(使用 musl)。- 事实证明,检查二进制文件是否是静态 linked 或不是那么简单:-)。