【发布时间】:2014-09-15 15:05:29
【问题描述】:
我的代码包括对 _write() 和 _sbrk() 等函数的间接调用。在项目中,我有一个名为 syscalls.c 的文件,它定义了我对这些函数的自定义实现,编译器/链接器找到了这个文件,并在我运行 make 时正确链接到这些函数。 make 创建的编译行如下所示:
arm-none-eabi-gcc -nostartfiles -mcpu=arm7tdmi -Wl,--gc-sections -Wl,--cref -L../hardware_drivers/lib -L../framework/lib -T../linker-script.lds -Wl,-Map,./build/bin/Mapfile.map -o build/bin/Elffile.elf ./build/obj/Main.o ./build/obj/SomeCode.o ./build/obj/syscalls.o -Wl,--start-group -lhardware_drivers -lframework -Wl,--end-group
这非常有效。但是,我想将 syscalls.c 移动到我拥有的 hardware_drivers 项目中,因此它们应该包含在我编译 hardware_drivers 时创建的 libharware_drivers.a 文件中,并包含在上面的 gcc 行中。移动文件并重新编译我的所有项目确实将我的 syscalls.c 包含在 .a 文件中(使用 arm-none-eabi-ar 显示)。但是,在编译我的顶级项目时,我得到了这个错误:
../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
我正在使用来自代码源的arm-none-eabi-gcc v4.8,并且我正在为 AT91SAM7A1 芯片编译它,如果这有任何相关性的话。
当链接器位于单独的库文件中时,您需要做一些特殊的事情来将链接器指向系统调用吗?
【问题讨论】:
标签: c gcc linker arm system-calls