(arm-none-linux-gnueabi-gcc Sourcery G++ Lite 2011.03-41) でRVCT 2.2
コンパイルされたテスト プログラムでコンパイルされた静的なサード パーティ ライブラリをリンクしようとしています。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 に動的にリンクすると仮定しますが、共有 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 がない場合は、バイナリ foo.a をhttp://dl.dropbox.com/u/14498565/foo.aからダウンロードできます。