linux - CMake保存剥离的调试信息

通常的做法是使用调试符号进行编译,然后使用objcopy将二进制文件分离到发布可执行文件和包含调试信息的文件中(然后将其包装到单独的包中或存储在符号服务器上)。
如何在cmake中正确地分离调试符号?我只看到了一些讨论和不完整的代码示例。
平台是Linux和GCC。


最佳答案:

cmake没有直接的支持,但是您可以使用一些后期构建和安装步骤来实现您想要的结果。然而,值得注意的是,使用objcopy并不是完成这类工作的唯一方法。您还可以使用构建ID,这很可能更容易用cmake实现。
几年前,迈克尔·赫特林(Michael Hertling)把一个pretty good description of your choices and the methods贴到了Cmake邮件列表上,而不是重复这里的全部内容。我将在这里选择一个工作方案作为参考,但我建议阅读这个链接。在gdb文档中还有一个甚至更多的complete discussion of the two alternatives,它应该填补关于这两种方法(调试链接与构建ID)的任何剩余空白。下面是Michael的一般构建ID方法(在他的示例中明确给出了构建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)

使用cmake_build_type==debug and build进行配置;随后调用
gdb-ex“设置调试文件目录。”-ex“文件主目录”
从cmake_binary_dir中读取“无调试符号”
找到“如预期。现在,发出“make install”,重新调用gdb并读取:
“正在从…/.build id/ab/cdef1234读取符号。调试”
如您所见,调试信息文件与剥离的
只能由构建ID执行;看不到objcopy。
上面利用了这样一个事实,.debug文件应该是一个正常的可执行文件,调试信息没有被删除。