CMake保存剥离的调试信息

Vel*_*kan 9 linux gcc cmake objcopy

通常的做法是使用调试符号进行编译,然后将二进制文件objcopy分成使用版本可执行文件和带有调试信息的文件(然后将其包装到单独的包中或存储在符号服务器上).

如何在CMake中正确分离调试符号?我只看到了一些讨论和不完整的代码示例.

平台是Linux和GCC.

Cra*_*ott 6

CMake 对此没有直接支持,但您可以使用一些 POST_BUILD 和 INSTALL 步骤来实现您想要的结果。然而,值得注意的是,使用objcopy并不是执行此类操作的唯一方法。您还可以使用 build-id,这很可能更容易通过 CMake 更可靠地实现。

与其在这里重复整个事情,几年前 Michael Herdling 发布到 CMake 邮件列表中,对您的选择和方法进行了很好的描述。我将在这里挑选可行的替代方案以供参考,但我建议阅读该链接。GDB 文档中还有对两种替代方案的更完整的讨论,它应该填补有关这两种方法(调试链接与构建 ID)的任何剩余空白。这是 Michael 的一般 build-id 方法(build-id 在他的示例中明确给出,请阅读参考文章以了解其预期代表的内容的解释):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(BUILDID C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(BUILDID "abcdef1234")
STRING(SUBSTRING "${BUILDID}" 0 2 BUILDIDPREFIX)
STRING(SUBSTRING "${BUILDID}" 2 8 BUILDIDSUFFIX)
FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){return 0;}\n")
ADD_EXECUTABLE(main main.c)
SET_TARGET_PROPERTIES(main PROPERTIES
    LINK_FLAGS "-Wl,--build-id=0x${BUILDID}")
ADD_CUSTOM_COMMAND(TARGET main POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:main>
                                     ${CMAKE_BINARY_DIR}/main.debug
    COMMAND ${CMAKE_STRIP} -g $<TARGET_FILE:main>)
INSTALL(FILES ${CMAKE_BINARY_DIR}/main.debug
    DESTINATION ${CMAKE_BINARY_DIR}/.build-id/${BUILDIDPREFIX}
    RENAME ${BUILDIDSUFFIX}.debug)
Run Code Online (Sandbox Code Playgroud)

使用 CMAKE_BUILD_TYPE==debug 和 build 进行配置;随后,调用

gdb -ex“设置调试文件目录。” -ex“文件主”

从 CMAKE_BINARY_DIR 中,您将按预期读取“未找到调试符号”。现在,发出“make install”,重新调用 gdb 并读取:

“从.../.build-id/ab/cdef1234.debug读取符号”

正如您所看到的,调试信息文件仅通过构建 ID与剥离的可执行文件连接;看不到任何对象副本。

上面利用了这样一个事实:该.debug文件预计是一个正常的可执行文件,并且调试信息未被删除。