gpt4 book ai didi

c - 如何从单独的库文件中包含 syscalls.c?

转载 作者:行者123 更新时间:2023-12-01 23:52:20 27 4
gpt4 key购买 nike

我的代码包括对 _write()_sbrk() 等函数的间接调用。在项目中,我有一个名为 syscalls.c 的文件,它定义了我对这些函数的自定义实现,编译器/链接器找到了这个文件,并在我运行 make 时正确链接到这些函数。编译行 make creates 看起来像这样:

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 芯片编译它。

当链接器位于单独的库文件中时,您是否需要做一些特别的事情来将链接器指向系统调用?

最佳答案

你用,

  1. -nostartfiles
  2. 您在 libhardware_drivers.a 中使用 _fstat 创建一个文件
  3. 您将一些代码与 _fstat_r 一起调用 ../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o)

这是错误信息,

../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): In function '_fstat_r': fstatr.c:(.text._fstat_r+0x1c): undefined reference to '_fstat'

您可以尝试从映射文件或-nodefaultlibs-nostdlibs 中找到使用_fstat_r 的代码。问题是库是按从前到后的顺序解决的。您的链接器列表末尾有一个隐式 -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 中解析对 _fstatlib_a-fstatr.o 引用。另一种方法是在另一个目标文件(如 Main.o)中强制使用一些合成引用。宏可以强制链接,

#define FORCE_LINK(x) void* __ ## x ## _force_link =(void*)&x
FORCE_LINK(fstat);

很可能您的静态库中有循环引用。即,hardware_driversframeworklibc(libc 指回hardware_drivers 让事情正常进行)。克服这个问题的方法是在命令行上多次列出库或重构您的代码,这可能是长期更好的方法。

重构就像一个单独的 libsyscall.a 一样简单,它列在 -lc 之后。

关于c - 如何从单独的库文件中包含 syscalls.c?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25851138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com