- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码包括对 _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 芯片编译它。
当链接器位于单独的库文件中时,您是否需要做一些特别的事情来将链接器指向系统调用?
最佳答案
你用,
-nostartfiles
_fstat
创建一个文件_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 中解析对 _fstat
的 lib_a-fstatr.o 引用。另一种方法是在另一个目标文件(如 Main.o)中强制使用一些合成引用。宏可以强制链接,
#define FORCE_LINK(x) void* __ ## x ## _force_link =(void*)&x
FORCE_LINK(fstat);
很可能您的静态库中有循环引用。即,hardware_drivers 指framework 指libc(libc 指回hardware_drivers 让事情正常进行)。克服这个问题的方法是在命令行上多次列出库或重构您的代码,这可能是长期更好的方法。
重构就像一个单独的 libsyscall.a 一样简单,它列在 -lc
之后。
关于c - 如何从单独的库文件中包含 syscalls.c?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25851138/
我正在阅读 syscall 包中的源代码,遇到了一些问题: 因为我对syscall 和assembly 完全是个菜鸟,所以不要犹豫,分享你所知道的一切:) 首先关于 func RawSyscall(t
我在一台机器上运行Docker镜像时看到以下错误 uname -r 3.10.0-229.7.2.el7.x86_64 2016/11/01 23:46:56 Error resolving sysc
不推荐使用 syscall 软件包。假设我有以下代码,希望将其迁移到不推荐使用的代码中: someGoObject := &struct{int; float32}{5, 45.4} syscall.
我正在尝试使用 VkKeyScan来自 Window 的 API,但是只要调用该函数,程序就会崩溃。我以这种方式导入和使用的其他 Window API 函数没有问题。我的 syscall.Syscal
在研究我的另一个问题时Go package syscall conn.Read() is non-blocking and cause high CPU usage , 我阅读了 syscall 包中
在 Windows 上使用 go 我有一个名为 sock 的 syscall.Handle,我想将其绑定(bind)到名为“sa”的 syscall.Sockaddr 结构中指定的地址。 如何填写 s
谁能告诉我为什么 syscall.Kill(pid, syscall.SIGSEGV) 只打印一次 "handlerSIGSEGV Sent by 0" ,但是 mustSendSIGSEGV 会打印
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 之后发生以下错误并尝试制作内核: $ sudo make make[1]: *** No rule to make targ
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 和尝试制作内核之后发生了以下错误: $ sudo make make[1]: *** No rule to make tar
我一直在尝试Go和Win32,发现了用于调用OS函数的以下两种变体(代码缩写): modUser32 = syscall.NewLazyDLL("user32.dll") procMessageBox
源代码是here 我对我的理解发表了评论 type mmapper struct { sync.Mutex active map[*byte][]byte // active mapp
这个问题在这里已经有了答案: What does a function without body mean? (1 个回答) 3年前关闭。 谁能解释一下 Go 标准库中 syscall 包中的以下代码
我目前正在尝试在 Go 上使用 user32.dll EnumWindows,但似乎无法正常工作 var( user32 = syscall.NewLazyDLL("user32.dll")
我的代码包括对 _write() 和 _sbrk() 等函数的间接调用。在项目中,我有一个名为 syscalls.c 的文件,它定义了我对这些函数的自定义实现,编译器/链接器找到了这个文件,并在我运行
我是新来的,目前正在尝试了解同事编写的一些代码 go func() { s := <-sigs if s == syscall.SIGURG { fmt.Println
我试图了解Golangs syscall软件包的一些底层细节。特别是,我对特定于Windows的系统调用感兴趣(请参见下面的示例)。 我可以找到基于UNIX的系统的syscall.Syscall()的
我有两个运行的过程,用Go语言编写,其中一个(sender.go)将消息发送到另一个(listener.go),同时通过websocket陷入for循环中。 问题是listener.go仅在终止循环后
有syscall它允许在 Linux 中进行间接系统调用。使用它的原因是什么 - 为什么它比直接调用函数更好? 最佳答案 有时内核会添加系统调用,C 库需要一段时间才能支持它们。 或者您可能正在旧的
您好 使用tkill() linux 内核调用向进程的每个线程发送信号 是否安全?因为它没有直接公开,所以我使用 syscall() 调用它。 我指的是链接 - . 但我不知道我是否应该在调用之前进行
当我创建模块时,它会发出此警告,并且会构建稍后的模块。但是如果没有实现我自己的系统调用“mycall”,构建模块有什么用 root@akshit-Vostro-1550:~/Desktop/Devic
我是一名优秀的程序员,十分优秀!