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'
两者memcpy
和memset
都应该存在于 libc 中。显然GCC
,如果我使用-static
. 有人可以解释发生了什么吗?我假设除非我添加标志,GCC
否则动态链接到 libc ,但不应该在共享 libc 库中定义类似的内容吗?-static
__aeabi_memcpy
编辑:
为了让人们自己测试,我现在创建了一个简约的测试用例,如下所示:
//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
如果您没有 RVCT,可以从http://dl.dropbox.com/u/14498565/foo.a下载二进制 foo.a。