5

コンパイル済みの C++ バイナリから未使用のシンボルをすべて削除したいと考えています。これは、私が使用しているツールチェーンである gcc を使用した概要を示しています: GCC と ld で未使用の C/C++ シンボルを削除するにはどうすればよいですか?

ただし、私のシステムでは、リンク オプション ( -Wl,--gc-sections) は拒否されます。

$ gcc -fdata-sections -ffunction-sections a.c -o a.o -Wl,--gc-sections
ld: fatal: unrecognized option '--'
ld: fatal: use the -z help option for usage information
collect2: error: ld returned 1 exit status

GCC 4.7 を使用して、Solaris の (比較的) 最近のフォークである illumos で実行しています。ここで使用する正しいリンカー オプションを知っている人はいますか?


編集:manページをより詳しく検索すると、「-zignore」が見つかりました:

 -z ignore | record

     Ignores, or records, dynamic dependencies that  are  not
     referenced   as  part  of  the  link-edit.  Ignores,  or
     records, unreferenced ELF sections from the  relocatable
     objects  that  are  read  as  part  of the link-edit. By
     default, -z record is in effect.

     If an ELF section is ignored, the section is  eliminated
     from  the  output  file  being  generated.  A section is
     ignored when three conditions are true.  The  eliminated
     section  must  contribute to an allocatable segment. The
     eliminated section must provide no  global  symbols.  No
     other  section  from  any object that contributes to the
     link-edit, must reference an eliminated section.

ただし、次のシーケンスは引き続きFUNCTION_SHOULD_BE_REMOVEDELF セクションに配置し.text.FUNCTIONます。

$ cat a.c
int main() {
    return 0;
}
$ cat b.c
int FUNCTION_SHOULD_BE_REMOVED() {
    return 0;
}
$ gcc -fdata-sections -ffunction-sections -c a.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections -c b.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections a.o b.o -Wl,-zignore
$ elfdump -s a.out                     # I removed a lot of output for brevity
Symbol Table Section:  .dynsym
[2]  0x08050e72 0x0000000a  FUNC GLOB  D    1 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED
Symbol Table Section:  .symtab
[71]  0x08050e72 0x0000000a  FUNC GLOB  D    0 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED

マニュアルページには「グローバルシンボルなし」と書かれているため、関数を「静的」にしてみましたが、最終結果は同じでした。

4

1 に答える 1

8

ld '-z ignore' オプションは定位置であり、コマンド ラインでそれ以降に発生する入力オブジェクトに適用されます。あなたが与えた例:

gcc a.o b.o -Wl,-zignore

どのオブジェクトにもオプションを適用しないため、何も実行されません。

gcc -Wl,-zignore a.o b.o

動作するはずです

于 2013-04-17T04:46:14.803 に答える