我想鏈接一個用RVCT 2.2
編譯的靜態第三方庫與用GCC
(arm-none-linux-gnueabi-gcc Sourcery G ++ Lite 2011.03-41)編譯的測試程序。將RVCT庫與GCC鏈接
如果我連接-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,除非我添加-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;
}
使用下面的命令:如果
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下載你別:
arm-none-linux-gnueabi-gcc -Wall bar.c foo.a -o bar
這給下面的輸出(除非也使用-static
)沒有RVCT。
工具鏈編譯時是否支持共享庫?我記得自己曾經看到過一個問題,並且我們沒有編譯支持共享庫的工具鏈。 – jszakmeister
不確定,它是CodeSourcery網站上提供的預編譯二進制文件。我可以創建共享庫,但我認爲它支持它。 – Leo
你正在使用類似-nodefaultlibs的東西嗎?如果是這樣,您可能需要手動鏈接到libgcc_s。 – jszakmeister