展開された Linaro GCC 6.2-2016.11ツールチェーンは、約 3.4 GB のディスク領域を占有するため、サイズを小さくしたいと考えています。私のターゲットはarmv7-a+vfpv3+hard_floatなので、必要のないもの ( 、、などld.gold
のライブラリ) は既に削除しましたが、それでもほぼ 1 GB を占めています。Thumb
v8-a
v7ve
strip
そのため、ツールを使用してバイナリから冗長な情報を削除したいと考えています。
私の主な質問は、この場合、ストリップの安全性を正しく効率的に使用する方法ですか?
一般に、ツールチェーンには、適用できるさまざまなバイナリ ファイルがありstrip
ます。*.exe
*.a
*.o
私が判断できるように、ファイル (ig arm-eabi-gcc.exestrip -s
)にのみ適用 (すべてのシンボルを削除)できます。私は正しいですか?*.exe
ライブラリに適用することは可能ですかstrip
(ig libgcc.a )?
私が理解したように(上記の例を参照)、ライブラリ内のシンボルは、さらに処理するために必要になる場合があります。
はいの場合、--strip-debug
代わりに使用する必要がありますか (デバッグ シンボルのみを削除します)?
以下の例は、これらの質問を示し、さらに明らかにします。
次の 3 つのファイルがあるとします。
// main.c:
#include "libgcc_test.h"
int main(void)
{
do_something();
return 0;
}
// libgcc_test.c:
void do_something(void)
{
return;
}
// libgcc_test.h:
void do_something(void);
一般に、各ファイルを個別にコンパイルして、一緒にリンクできるオブジェクト ファイルを取得します。
$ ./arm-eabi-gcc.exe main.c -c
$ ./arm-eabi-gcc.exe libgcc_test.c -c
オブジェクト ファイルを分析すると、予想どおり、do_somethingシンボルがlibgcc_test.oで定義され、 main.oで未定義であることがわかります。
$ ./arm-eabi-nm.exe main.o
U do_something
00000000 T main
$ ./arm-eabi-nm.exe libgcc_test.o
00000000 T do_something
strip -s
両方のファイルまたはmain.oのみに適用してリンクしようとすると、次のように動作します。
$ ./arm-eabi-nm.exe main.o
arm-eabi-nm.exe: main.o: no symbols
$ ./arm-eabi-nm.exe libgcc_test.o
arm-eabi-nm.exe: libgcc_test.o: no symbols
$ ./arm-eabi-ld.exe libgcc_test.o main.o -o main
arm-eabi-ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000
しかし、libgcc_test.ostrip -s
のみに適用すると、リンカーはエラー メッセージを生成します。
$ ./arm-eabi-strip.exe -s libgcc_test.o
$ ./arm-eabi-ld.exe libgcc_test.o main.o -o main
arm-eabi-ld.exe: warning: cannot find entry symbol _start; defaulting to 00008000
main.o: In function `main':
main.c:(.text+0x8): undefined reference to `do_something'
私が理解しているように、オブジェクトファイルに未解決のシンボルが存在すると、リンカーはそれを解決する必要があります。リンクする前にオブジェクト ファイルからこのシンボルを削除するとどうなりますか?
オブジェクト ファイルをリンクする前にオブジェクト ファイルからシンボルを削除することは正しく安全ですか? はいの場合、どのシンボルを削除できますか?
実際のプロジェクトではstrip -s
、ツールチェーン ライブラリ ( libgcc.a、libc.a、libm.a、librdimon.a"undefined reference to..."
など) に適用すると、リンク段階で同様に多くのメッセージが生成されます。
しかし、--strip-debug
オプションを使用すると、リンカは のようなライブラリに対してメッセージを生成しますskipping incompatible libgcc.a when searching for -lgcc
。ライブラリを元に戻すと、正常にリンクされます。
skipping incompatible...
この場合のメッセージとは何を意味するのでしょうか?
ご協力ありがとう御座います。