gpt4 book ai didi

gcc - 将 RVCT 库与 GCC 链接

转载 作者:行者123 更新时间:2023-12-04 05:33:55 37 4
gpt4 key购买 nike

我试图链接一个用 RVCT 2.2 编译的静态第三方库使用 GCC 编译的测试程序(arm-none-linux-gnueabi-gcc Sourcery G++ Lite 2011.03-41)。

如果我链接到 -static ,一切正常。如果我不使用 -static但是,我收到了很多类似以下的投诉:

foolib.a(foo.o): In function `foofunc':
foo.c:(.text+0x4c8): undefined reference to `__aeabi_memcpy'
foolib.a(bar.o): In function `barfunc':
bar.c:(.text+0xa54): undefined reference to `__aeabi_memclr4'

两者 memcpymemset应该存在于 libc 中。
清楚 GCC如果我使用 -static 可以以某种方式检测并修复此问题.有人可以解释发生了什么吗?我假设 GCC除非我添加 -static,否则动态链接到 libc标志,但不应该 __aeabi_memcpy并且在共享的 libc 库中也定义了类似的内容?

编辑:
为了让人们自己测试,我现在创建了一个简单的测试用例,如下所示:
//foo.c
#include <string.h>

void foo(void *dst, void *src, int num) {
memcpy(dst, src, num);
}

这个文件是用 RVCT 2.2 编译和存档的,如下所示:
armcc.exe --arm -c --apcs=/noswst/interwork foo.c -o foo.o
armar.exe --create foo.a foo.o

然后将该库与以下测试程序链接:
//bar.c
#include <stdio.h>
extern void foo(void *dst, void *src, int num);
int main(int argc, char *argv[]) {
int a[10], b[10], i;

for (i = 0; i < 10; i++) {
a[i] = i;
}

foo(b, a, sizeof(a));

for (i = 0; i < 10; i++) {
if (a[i] != b[i]) {
printf("Diff at %d: %d != %d\n", i, a[i], b[i]);
return 1;
}
}
printf("Success!\n");
return 0;
}

使用以下命令:
arm-none-linux-gnueabi-gcc -Wall bar.c foo.a -o bar

这给出了以下输出(除非还使用了 -static):
foo.a(foo.o): In function `foo':
foo.c:(.text+0x0): undefined reference to `__aeabi_memcpy'
arm-none-linux-gnueabi/bin/ld: bar: hidden symbol `__aeabi_memcpy' isn't defined
arm-none-linux-gnueabi/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status

二进制文件 foo.a 可以从 http://dl.dropbox.com/u/14498565/foo.a 下载如果您没有 RVCT。

最佳答案

在与@Leo 相处一段时间后,我想我明白发生了什么。似乎 foo.o 的编译方式需要到 __aeabi_memcpy 的静态链接。 .用 arm-none-linux-gnueabi-objdump -t 查看 foo.o ,我看到这个:

foo.o:     file format elf32-littlearm

SYMBOL TABLE:
00000000 l df *ABS* 00000000 foo.c
00000000 l d .text 00000000 .text
00000000 l *ABS* 00000000 BuildAttributes$$THUMB_ISAv1$ARM_ISAv4$M$PE$A:L22$X:L11$S22$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$EBA8$REQ8$PRES8$EABIv2
00000000 l O .debug_frame$$$.text 00000000 C$debug_frame$$$.text7
00000000 w F *UND* 00000000 .hidden Lib$$Request$$armlib
00000000 F *UND* 00000000 .hidden __aeabi_memcpy
00000000 g F .text 00000004 .hidden foo

请注意 -t在命令行中......这是为了向我们展示静态符号(非共享)。运行 arm-none-linux-gnueabi-objdump -T在 foo.o 上显示:
foo.o:     file format elf32-littlearm

/home/jszakmeister/.local/sourcery-arm-gnueabi/bin/arm-none-linux-gnueabi-objdump: foo.o: not a dynamic object
DYNAMIC SYMBOL TABLE:
no symbols

所以 __aeabi_memcpy正在寻求通过静态链接解决,这就是使用 -static 的原因作品。我相信如果你编译 foo.o 有点不同,所以它需要一个共享的 C 库,那么你可以链接到 foo.a 而不指定 -static。不幸的是,我不熟悉 RVCT 编译器,或者我会告诉您如何使用。

FWIW,使用 strace我能够看到它确实链接到共享的 C 库,但没有解析链接。我也用过 --sysroot=/path/to/code/sourcery/toolchain/arm-none-linux-gnueabi/libc命令行选项以确保它找到了正确的 C 库。

关于gcc - 将 RVCT 库与 GCC 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12213372/

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