メモ:gccで不要な関数をリンクしない方法

普通はリンカはライブラリ(.a)になっている場合にはいらないファイル(.o)ごと消してくれる。これを関数単位で消してもらおう、という話。

-ffunction-sections -Wl,--gc-sectionsらしい。ここ(radiumsoftware.com)より。

しかし、消えない。Oops!

使っていないfunc2()が残ってしまう。

#include <stdio.h>

int func1(){ printf(“Hello, World!\n”); }
int func2(){ printf(“Good-bye, World!\n”);}

int main(int argc, char **argv){
func1();
return 0;
}

# gcc -ffunction-sections -Wl,–gc-sections test.c
# objdump -d a.out
:(略)
08048338 <func1>:
8048338: 55 push %ebp
8048339: 89 e5 mov %esp,%ebp
804833b: 83 ec 08 sub $0x8,%esp
804833e: c7 04 24 e4 83 04 08 movl $0x80483e4,(%esp,1)
8048345: e8 1e ff ff ff call 8048268 <_init+0x38>
804834a: c9 leave
804834b: c3 ret

0804834c <func2>:
804834c: 55 push %ebp
804834d: 89 e5 mov %esp,%ebp
804834f: 83 ec 08 sub $0x8,%esp
8048352: c7 04 24 f3 83 04 08 movl $0x80483f3,(%esp,1)
8048359: e8 0a ff ff ff call 8048268 <_init+0x38>
804835e: c9 leave
804835f: c3 ret
:(略)

しかしながら、-ffunction-sectionsは機能していて、以下のように関数毎にセクションに分かれてコードも正しく配置されている。

# gcc -c -ffunction-sections test.c
# objdump -d test.o

test.o: file format elf32-i386

Disassembly of section .text:
Disassembly of section .text.func1:

00000000 <func1>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: c7 04 24 00 00 00 00 movl $0x0,(%esp,1)
d: e8 fc ff ff ff call e <func1+0xe>
12: c9 leave
13: c3 ret
Disassembly of section .text.func2:

00000000 <func2>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: c7 04 24 0f 00 00 00 movl $0xf,(%esp,1)
d: e8 fc ff ff ff call e <func2+0xe>
12: c9 leave
13: c3 ret
Disassembly of section .text.main:

00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 83 e4 f0 and $0xfffffff0,%esp
9: b8 00 00 00 00 mov $0x0,%eax
e: 29 c4 sub %eax,%esp
10: e8 fc ff ff ff call 11 <main+0x11>
15: c9 leave
16: c3 ret

してみると、リンカが悪いのかな?? binutilsのバージョン上げてみようかな。

(追記) 2004-02-03 13:26

-staticつけたら消えた。

# gcc -static -ffunction-sections -Wl,–gc-sections test.c
# objdump -d a.out | grep func
0804819d <func1>:
80481c1: e8 d7 ff ff ff call 804819d <func1>

そういう問題じゃなくて?

(追記) 2004-02-03 14:19

ld(1)に、次のように書いてあった。

       --no-gc-sections
--gc-sections
Enable  garbage collection of unused input sections.  It is ignored
on targets that do not support this option.   This  option  is  not
compatible  with  -r,  nor  should it be used with dynamic linking.
The default behaviour (of not performing this  garbage  collection
can be restored by specifying --no-gc-sections on the command line.

ダイナミックリンクはダメだってさ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です