相同的来源,2 个不同的二进制文件,带有一个链接器脚本变量
Same sources, 2 different binaries with a linker script variable
使用 CMake,我尝试使用相同的来源和相同的 linker 脚本来生成两个不同的二进制文件。
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = APP_ORIGIN, LENGTH = 0x40000
}
APP_ORIGIN 在 linker 脚本中设置为输入,使用 --defsym=APP_ORIGIN=VALUE .
set(APP1_ORIGIN 0x0800C200)
set(APP2_ORIGIN 0x0804C200)
SET(CMAKE_EXE_LINKER_FLAGS "-T${LINKER_FILE} -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nano.specs -lc -lm -lnosys -Wl,-Map=${PROJECT_NAME}.map,--cref -Wl,--gc-sections -Xlinker -print-memory-usage -Xlinker --defsym=APP_ORIGIN=${APP1_ORIGIN}")
重点是我不知道如何用APP2_ORIGIN值修改CMAKE_EXE_LINKER_FLAGS并触发link 再次.
这可以用 2 个不同的目标来完成,但是如果只有一个 linker 脚本,只需要维护一个,因为应用程序完全相同,只有偏移量变化.
我尝试了 POST_BUILD 自定义目标的不同方法,但直到现在都没有成功。
文件是从输入 模板.生成的。
创建文件inputfile
:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = @APP_ORIGIN@, LENGTH = 0x40000
}
然后做:
configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)
configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)
或者与 add_custom_command
和自定义脚本相同。
然后做:
add_library(allobjectfiles all_your_files.c) # maybe OBJECT library?
add_executable(yourtarget)
target_link_libraries(yourtarget allobjectfiles)
target_link_options(yourtarget PUBLIC
-T${CMAKE_BUILD_DIR}/linkerscript1
)
set_target_properties(yourtarget PROPERTIES LINK_DEPENDS
${CMAKE_BUILD_DIR}/linkerscript1
)
# Repeat above for linkerscript2 with different target name
使用 CMake,我尝试使用相同的来源和相同的 linker 脚本来生成两个不同的二进制文件。
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = APP_ORIGIN, LENGTH = 0x40000
}
APP_ORIGIN 在 linker 脚本中设置为输入,使用 --defsym=APP_ORIGIN=VALUE .
set(APP1_ORIGIN 0x0800C200)
set(APP2_ORIGIN 0x0804C200)
SET(CMAKE_EXE_LINKER_FLAGS "-T${LINKER_FILE} -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -specs=nano.specs -lc -lm -lnosys -Wl,-Map=${PROJECT_NAME}.map,--cref -Wl,--gc-sections -Xlinker -print-memory-usage -Xlinker --defsym=APP_ORIGIN=${APP1_ORIGIN}")
重点是我不知道如何用APP2_ORIGIN值修改CMAKE_EXE_LINKER_FLAGS并触发link 再次.
这可以用 2 个不同的目标来完成,但是如果只有一个 linker 脚本,只需要维护一个,因为应用程序完全相同,只有偏移量变化.
我尝试了 POST_BUILD 自定义目标的不同方法,但直到现在都没有成功。
文件是从输入 模板.生成的。
创建文件inputfile
:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K
FLASH (rx) : ORIGIN = @APP_ORIGIN@, LENGTH = 0x40000
}
然后做:
configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)
configure_file(inputfile ${CMAKE_BUILD_DIR}/linkerscript1 @ONLY)
或者与 add_custom_command
和自定义脚本相同。
然后做:
add_library(allobjectfiles all_your_files.c) # maybe OBJECT library?
add_executable(yourtarget)
target_link_libraries(yourtarget allobjectfiles)
target_link_options(yourtarget PUBLIC
-T${CMAKE_BUILD_DIR}/linkerscript1
)
set_target_properties(yourtarget PROPERTIES LINK_DEPENDS
${CMAKE_BUILD_DIR}/linkerscript1
)
# Repeat above for linkerscript2 with different target name