我比较了三个编译器:
int myglob = 42;
int ml_func(int a, int b)
{
myglob += a;
return b + myglob;
}
我编译了所有这样的来源:
powerpc-linux-gcc -c -o hugo.o hugo.c
powerpc-linux-gcc --shared -o hugo.so hugo.o
文件之间的区别似乎是填充(hexdump hugo.so | wc -l
):
(objdump -s
显示类似的结果)
问题:
谢谢!
-
修改
它也独立于GCC规范。我抛弃了(-dumpspec
)代码源(4.6.0)GCC的规范,它产生了一个小的共享对象,并将它与Buildroot GCC(-specs
)一起使用,并再次获得了一个67K的共享对象。
答案 0 :(得分:1)
来自How to reduce ELF section padding?:
看起来这是因为binutils 2.27将PowerPC目标的默认页面大小增加到64k,导致嵌入式平台上出现臃肿的二进制文件。
这里有关于crosstool-NG github的讨论。
使用--disable-relro配置binutils可以改善一切。
您还可以在编译时将-Wl,-z,max-page-size = 0x1000添加到gcc。
将BR2_BINUTILS_EXTRA_CONFIG_OPTIONS="--disable-relro"
添加到我的buildroot配置时,共享对象的大小会减少。