首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从单独的库文件中包含syscalls.c?

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

Stack Overflow用户
提问于 2014-09-15 15:05:29
回答 1查看 2.4K关注 0票数 3

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

代码语言:javascript
复制
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显示)。但是,在编译顶级项目时,我会得到以下错误:

代码语言:javascript
复制
../../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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 16:24:13

你用,

  1. -nostartfiles
  2. 使用_fstat在libhardware_drivers.a中创建一个文件
  3. 在调用../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o)的_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。

例如,

代码语言:javascript
复制
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)中强制使用一些合成引用。宏可以强制链接,

代码语言:javascript
复制
#define FORCE_LINK(x) void* __ ## x ## _force_link =(void*)&x
FORCE_LINK(fstat);

很可能在静态库中有循环引用。Ie,hardware_drivers指的是框架,指的是libc (而libc指的是为了使事情正常工作而返回到hardware_drivers )。克服这一问题的方法是在命令行上多次列出库,或者重构代码,这可能是更好的长期方法。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25851138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档