2014-04-10 49 views
3

我有一個需要訪問嵌入到special section中的可執行文件中的ELF文件的項目。CMake:將ELF嵌入到可執行文件中

我之前手工製作Makefiles,只是有一個shell腳本,我使用objcopy將我想要嵌入到.o文件的目標複製到可執行文件中,然後鏈接到該文件。

# Create a new section and copy the binary there ($1=input $2=output name) 
objcopy --input-target binary --output-target elf64-x86-64 \ 
     --binary-architecture i386 $1 $2.o 

現在我想擺脫定製的Makefiles並使用CMake來生成它們。但是,我沒有看到鏈接到這種文件的簡單方法。我能夠創建並添加該文件,但不反對鏈接:

# Invoke script to package module as a library 
add_custom_command(OUTPUT ${PACKAGED_FILE} 
    COMMAND ./package.sh ${MODULE_FILE} ${PACKAGED_FILE} 
    WORKING_DIRECTORY ${MODULE_DIR} 
    DEPENDS ${MODULE_FILE} 
    COMMENT packaging file into ELF object 
    VERBATIM 
) 

add_custom_target(${PACKAGED_NAME} ALL DEPENDS ${PACKAGED_FILE}) 

我試圖用添加:

target_link_libraries(binary ${PROJECT_BINARY_DIR}/${PACKAGED_FILE}) 

然而,失敗的原因是文件不存在然而。它會,但CMake不知道。將目標名稱作爲鏈接庫添加無助,因爲無法找到它。將它作爲依賴項添加也沒有幫助。有沒有人有一個想法如何完成?

+0

你是否嘗試過使用add_custom_command這個簽名:'add_custom_command(TARGET binary PRE_LINK [你的命令像往常一樣]),它應該在鏈接之前調用你的命令(如果我理解add_custom_command)。 – archz

回答

3

我們正在做我們的項目類似的事情 - 我們CMakeLists.txt以下部分的伎倆:

set(PROJECT_EMBED_OBJ_FILES "") 
set(PROJECT_EMBED_FILES "file1.elf" "file2.elf") 
foreach(FILENAME ${PROJECT_EMBED_FILES}) 
    get_filename_component(FILENAME_ONLY ${FILENAME} NAME) 
    get_filename_component(FILEPATH_ONLY ${FILENAME} PATH) 
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o 
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${FILEPATH_ONLY} 
         COMMAND ${CMAKE_OBJCOPY} 
         ARGS -I binary -O elf64-x86-64 -B i386 ${FILENAME_ONLY} ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o) 
    list(APPEND PROJECT_EMBED_OBJ_FILES ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o) 
    message(STATUS "Objcopy'ing ${FILENAME}") 
endforeach(FILENAME) 

然後在調用add_executable

add_executable(projectname ${PROJECT_SOURCES} ${PROJECT_EMBED_OBJ_FILES}) 
0

您可以嘗試

add_custom_command(TARGET $(PROJECT_NAME).elf 
    POST_BUILD 
    COMMAND ${CMAKE_OBJCOPY} ARGS -O binary ${PROJECT_NAME}.elf \ 
${PROJECT_NAME}.bin) 

把這個放在你的add_executable()之後。 POST_BUILD表示在構建之後執行。

相關問題