1

gcc /g++を使用してx86/Linuxでビルドされたコードで、未使用の関数(呼び出しが行われていない)を削除しようとしています。gccマニュアルから読んだように、以下のオプションを使用します。

CCFLAGS = -ffunction-sections -fdata-sections -Wl,--gc-sections,--print-gc-sections

Makeコマンドの出力には、以下のようにいくつかの未使用のセクションが削除されたメッセージが表示されます。

/usr/bin/ld: Removing unused section '.text._ZN14myclass30myunusedfuncEPPNS_8device_sE' in file './myproject/x86-linux/release/file1.o'

ただし、念のため、そのシンボルが* .oオブジェクトファイルに存在するかどうかを確認しようとしたので、次のようにします。

strings --all -f file1.o|grep myunusedfunc

以下のような出力が表示されます

myproject/x86-linux/debug/file1.o: [] myclass::myunusedfunc()
myproject/x86-linux/debug/file1.o: myunusedfunc
myproject/x86-linux/debug/file1.o: _ZN14myclass30myunusedfuncEPPNS_8device_sE
myproject/x86-linux/debug/file1.o: .rel.text._ZN14myclass30myunusedfuncEPPNS_8device_sE
myproject/x86-linux/debug/file1.o: _ZN14myclass30myunusedfuncEPPNS_8device_sE

どうしたの?

未使用の関数は、これらのgcc/ldオプションによって実際に削除されていますか。

4

1 に答える 1

1

あなたは.oファイルを見ていますが、それはリンカーへの入力であり、出力ではありません。ファイルにはすべての関数が含まれます。.oリンカは未使用の関数をリンクされた出力に出力しないようにする必要があります。.oただし、ファイルは編集されません。

于 2013-01-08T01:19:39.543 に答える