使用arm-none-eabi-gcc编译并链接库liba.a时出现错误

12

我正在64位Linux机器上编译一个C语言的Hello World程序。我正在使用GCC ARM嵌入式工具链在一块搭载ATMEL AT91SAM9G20处理器的FOX G20 V开发板上进行交叉编译。

第一次尝试编译时,我遇到了一些错误,因为程序无法识别printf、return等标准C函数。因此,我决定通过执行arm-none-eabi-gcc -o hello hello.c libc.a来连接这些函数(如果我错了,请纠正),但结果仍然会出现错误:

libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
collect2: error: ld returned 1 exit status

尽管我已经将库链接到应用程序,但我真的不确定为什么程序仍然无法识别标准函数。如果有人知道原因或者解决问题的方法,我会非常感激。

更新

我从这里下载了glibc库。我从newlib-2.1.0/libgloss/arm中找到了syscalls.c库,并编译创建了一个静态库。当我将该库链接到我的应用程序代码时,仍然出现相同的错误。


2
你使用的是哪个GCC ARM嵌入式工具链?看起来这些未定义的引用是函数,你(或其他人)需要编写以将libc.a库集成到特定平台中。 - Michael Burr
1
@MichaelBurr 这是Linero GCC的预构建32位版本。所以如果需要,我会添加到libc.a库中吗?那么如果需要添加什么呢? - Adam
2个回答

19

尝试执行此操作:

arm-none-eabi-gcc --specs=rdimon.specs -lgcc -lc -lm -lrdimon -o hello hello.c

您的工具包似乎提供了librdimon.a,这是一个库,提供基本的标准C函数。


2

我遇到了这个错误,因为我的二进制文件无法适应ROM。

我的第一个错误是:

address 0x34000 of arm_flash.elf section `.mmu_tbl' is not within region `ps7_ram_0`

然后我得到了同样的未定义引用错误列表。

我需要通过从我的 C++ 代码中删除new关键字和所有动态内存分配来减小二进制文件的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接