CMake не имеет прямой поддержки для этого, но вы можете использовать некоторые шаги POST_BUILD и INSTALL для достижения желаемого результата. Однако стоит отметить, что использование objcopy
— не единственный способ сделать такого рода вещи. Вы также можете использовать идентификатор сборки, и это может быть проще реализовать с помощью CMake.
Вместо того, чтобы повторять все это здесь, есть довольно хорошее описание вашего выбора и методов, который несколько лет назад был опубликован в списке рассылки CMake Майклом Хертлингом. Я просто выберу рабочую альтернативу здесь для справки, но я рекомендую прочитать эту ссылку. Также есть еще более полное обсуждение двух альтернатив в Документация GDB, которая должна заполнить все оставшиеся пробелы в отношении двух подходов (отладочная ссылка или идентификатор сборки). Вот общий подход Майкла к идентификатору сборки (идентификатор сборки явно указан в его примере, прочитайте статьи, на которые есть ссылки, для объяснения того, что он должен представлять):
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 == отладка и сборка; впоследствии вызвать
gdb -ex "установить каталог-файла отладки ." -ex "основной файл"
из CMAKE_BINARY_DIR, и вы прочтете «символы отладки не найдены», как и ожидалось. Теперь введите «make install», повторно вызовите gdb и прочитайте:
"Чтение символов из .../.build-id/ab/cdef1234.debug"
Как видите, файл отладочной информации связан с удаленным исполняемым файлом исключительно по идентификатору сборки; нет объекта в поле зрения.
В приведенном выше примере используется тот факт, что файл .debug
должен быть обычным исполняемым файлом с не удаленной отладочной информацией.
person
Craig Scott
schedule
23.11.2015