【发布时间】:2017-06-21 12:02:44
【问题描述】:
我的问题如下:
我正在尝试编写嵌入式应用程序,它必须提供自己的链接器脚本(使用 arm-none-eabi-gcc 编译器/链接器)。
嵌入式引导加载程序加载二进制文件并从 0x8000 地址开始,这就是为什么我需要一个专用的链接器脚本,它允许我将所需的启动功能放入该地址。脚本代码如下:
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x1000
}
SECTIONS
{
.start : { *(.start) } > ram
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}
有了这个,我现在想做的是有一个函数,它将被插入到 .start 部分,所以它位于 0x8000 的开头。为此,在我的库中,我使用以下函数:
__attribute__((section(".start"))) void notmain() {
main();
}
这似乎工作正常,但后来我将此库与函数notmain 与项目链接,该项目定义了main() 函数。在链接过程中,我可以看到 .start 部分不再存在并且 notmain 符号
完全失踪了。当我将 notmain 函数移出库(进入项目)时,一切都很好。
我的理解是,链接器看到,我的应用程序中根本没有使用 .start 部分,这使得它跳过了所有部分。我已经尝试向函数 notmain 添加几个属性,例如 (__attribute__((used)) __attribute__((externally_visible))),但它也不起作用(最终二进制文件中仍然缺少 notmain)。
CMake 源码如下:
** 项目**
project(AutomaticsControlExample)
enable_language(ASM)
set(CMAKE_CXX_STANDARD 14)
set(SOURCES main.cpp PID.hpp)
set(DEPENDENCIES RPIRuntime PiOS)
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${DEPENDENCIES})
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_OBJDUMP} -D ${PROJECT_NAME}
COMMAND ${CMAKE_OBJDUMP} -D ${PROJECT_NAME} > ${PROJECT_NAME}.list
COMMAND ${CMAKE_OBJCOPY} ${PROJECT_NAME} -O binary ${PROJECT_NAME}.bin
COMMAND ${CMAKE_OBJCOPY} ${PROJECT_NAME} -O ihex ${PROJECT_NAME}.hex)
** 图书馆 **
project(RPIRuntime)
enable_language(ASM)
set(CMAKE_CXX_STANDARD 14)
set(LINKER_SCRIPT memmap)
set(LINKER_FLAGS "-T ${CMAKE_CURRENT_SOURCE_DIR}/${LINKER_SCRIPT}")
set(SOURCES
notmain.cpp
assert.cpp)
add_library(${PROJECT_NAME} STATIC ${SOURCES})
target_link_libraries(${PROJECT_NAME} ${LINKER_FLAGS})
我的问题是:有什么方法可以防止链接器省略链接 .start 部分?
【问题讨论】: