[英]CMake save stripped debug information
通常的做法是使用調試符號進行編譯,然后使用objcopy
將二進制文件objcopy
為版本可執行文件和帶有調試信息的文件(然后將其包裝到單獨的包中或存儲在符號服務器上)。
如何在CMake中正確分離調試符號? 我只看到了一些討論和不完整的代碼示例。
平台是Linux和GCC。
CMake沒有直接支持,但您可以使用一些POST_BUILD和INSTALL步驟來實現您想要的結果。 然而,值得注意的是,使用objcopy
不是執行此類操作的唯一方法。 您還可以使用build-id,這可能更容易使用CMake實現。
這里不是重復整篇文章,而是幾年前由邁克爾·赫特林(Michael Hertling)發布到CMake郵件列表中的選擇和方法的非常好的描述 。 我將在這里選擇工作替代方案以供參考,但我建議閱讀該鏈接。 還有一個關於 GDB文檔中兩個備選方案的更完整的討論,它應該填補關於這兩種方法的任何剩余空白(調試鏈接與build-id)。 這是Michael的一般構建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)
配置CMAKE_BUILD_TYPE == debug和build; 隨后,調用
gdb -ex“set debug-file-directory。” -ex“文件主”
從CMAKE_BINARY_DIR中,您將按預期讀取“未找到調試符號”。 現在,發出“make install”,重新調用gdb並閱讀:
“閱讀...... /。build-id / ab / cdef1234.debug中的符號”
如您所見,調試信息文件僅通過構建ID與剝離的可執行文件連接; 看不到任何對象。
上面使用的事實是.debug
文件應該是一個普通的可執行文件,調試信息沒有被剝離。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.