【发布时间】:2014-03-05 07:36:39
【问题描述】:
标准 C (ISO/IEC 9899:1999) 第 6.5.3.4 节说
sizeof 运算符不应应用于具有 函数类型或不完整类型
但是为什么?
使用readelf 检查可执行文件会发现函数大小在编译期间完全知道。
Symbol table '.symtab' contains 67 entries:
Num: Value Size Type Bind Vis Ndx Name
.......
37: 0000000000400541 16 FUNC LOCAL DEFAULT 13 clean
.......
46: 00000000004005f0 2 FUNC GLOBAL DEFAULT 13 __libc_csu_fini
......
49: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5
52: 00000000004005f4 0 FUNC GLOBAL DEFAULT 14 _fini
53: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
ed
58: 0000000000400560 137 FUNC GLOBAL DEFAULT 13 __libc_csu_init
62: 000000000040052c 21 FUNC GLOBAL DEFAULT 13 main
这里的大小0 属于共享库中的函数,例如puts@@GLIBC_2.2.5 函数。于是我查了libc的信息,这里有一段readelf -a /lib/x86_64-linux-gnu/libc.so.6输出与puts@@GLIBC_2.2.5相关
Size Type
...........
399: 0000000000070ec0 392 FUNC WEAK DEFAULT 12 puts@@GLIBC_2.2.5
它只是不必要的功能,还是违反了C 理念,或者有一些我看不到的技术问题?
【问题讨论】:
-
如果函数被内联怎么办?如何计算它的大小?