【发布时间】:2012-08-31 10:18:57
【问题描述】:
我正在尝试将使用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 中。
显然,如果我使用 -static,GCC 可以以某种方式检测并解决此问题。有人可以解释发生了什么吗?我假设 GCC 动态链接到 libc,除非我添加 -static 标志,但不应该在共享 libc 库中定义 __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。
【问题讨论】:
-
工具链编译时是否支持共享库?我记得有一次我自己看到过一个问题,我们没有编译支持共享库的工具链。
-
不确定,它是 CodeSourcery 网站上提供的预编译二进制文件。我可以用它创建共享库,所以我认为它支持它。
-
你在使用类似 -nodefaultlibs 的东西吗?如果是这样,您可能需要手动链接 libgcc_s。
-
这篇文章说arm编译器可以将memcpy链接到一个特别优化的。 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/…
-
@jszakmeister 不,我用
arm-none-linux-gnueabi-gcc -Wall -O2 testprog.c library.a -o testprog编译,加上-static让它工作。
标签: gcc linker arm static-linking