私は GNU ld の専門家ではありませんが、ドキュメントで次の情報を見つけました。
特別な secname `/DISCARD/' を使用して、入力セクションを破棄できます。`/DISCARD/' という名前の出力セクションに割り当てられたセクションは、最終的なリンク出力には含まれません。
これがお役に立てば幸いです。
アップデート:
(これはソリューションの最初のバージョンであり、INTERP セクションがヘッダー PT_INTERP と共に削除されているため機能しません。)
main.c:
int main(int argc, char **argv)
{
return 0;
}
main.x:
SECTIONS {
/DISCARD/ : { *(.interp) }
}
ビルド コマンド:
$ gcc -nostdlib -pie -static -Wl,-T,main.x main.c
$ readelf -S a.out | grep .interp
オプション -Wl,-T,main.x なしのビルド コマンド:
$ gcc -nostdlib -pie -static main.c
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000000218
$ readelf -S a.out | grep .interp
[ 1] .interp PROGBITS 00000134 000134 000013 00 A 0 0 1
更新 2:
この解決策のアイデアは、元のセクション 'INTERP' (リンカー スクリプト ファイル内の . interp) の名前を .interp1 に変更することです。つまり、セクションの内容全体が .interp1 セクションに配置されます。したがって、デフォルトのリンカー スクリプト設定が失われることを心配することなく、INTERP セクション (現在は空) を安全に削除できます。したがって、ヘッダー INTERP_PT も削除されます。
SECTIONS {
.interp1 : { *(.interp); } : NONE
/DISCARD/ : { *(.interp) }
}
セクション INTERP の内容がファイル (.interp1 として) に存在するが、INTERP_PT ヘッダーが削除されていることを示すために、readelf + grep の組み合わせを使用します。
$ gcc -nostdlib -pie -Wl,-T,main.x main.c
$ readelf -l a.out | grep interp
00 .note.gnu.build-id .text .interp1 .dynstr .hash .gnu.hash .dynamic .got.plt
$ readelf -S a.out | grep interp
[ 3] .interp1 PROGBITS 0000002e 00102e 000013 00 A 0 0 1