我的代码包括对像_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行中。移动文件和重新编译我的所有项目确实在.a文件中包含了syscalls.c (使用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'我正在使用代码sourcery中的arm-none-eabi-gcc v4.8,如果这与AT91SAM7A1芯片有任何关联的话,我将它编译成一个AT91SAM7A1芯片。
当链接器位于一个单独的库文件中时,您需要做一些特殊的事情来指向syscalls吗?
发布于 2014-09-15 16:24:13
你用,
-nostartfiles_fstat在libhardware_drivers.a中创建一个文件_fstat_r中使用一些代码这是错误信息,
函数‘_fstat_r’中的../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o)::fstatr.c:(.text._fstat_r+0x1c):对'_fstat‘的未定义引用
您可以尝试从地图文件中查找使用_fstat_r的代码,或者使用-nodefaultlibs或-nostdlibs。问题是库是按照第一到最后的顺序解决的。在链接器列表的末尾有一个隐式-lc。如果您打算使用'C‘库,则必须更改链接器命令以在链接的稍后位置定位libhardware_drivers.a。
例如,
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 -lc -lhardware_drivers -lframework -Wl,--end-group在这里,-lc放在-lhardware_drivers之前。这将让链接器解析syscall.o中对_fstat的lib_a-fstatr.o引用。另一种方法是在前面的另一个对象文件(如Main.o)中强制使用一些合成引用。宏可以强制链接,
#define FORCE_LINK(x) void* __ ## x ## _force_link =(void*)&x
FORCE_LINK(fstat);很可能在静态库中有循环引用。Ie,hardware_drivers指的是框架,指的是libc (而libc指的是为了使事情正常工作而返回到hardware_drivers )。克服这一问题的方法是在命令行上多次列出库,或者重构代码,这可能是更好的长期方法。
重组就像一个单独的libsyscall.a一样简单,它列在-lc之后。
https://stackoverflow.com/questions/25851138
复制相似问题