【发布时间】:2018-01-17 10:16:03
【问题描述】:
我比较了三个编译器:
- 来自 Debian (6.3.0) 的 GCC (x86) 生成具有 7.8K、 的 hugo_x86.so
- 来自 Codesourcery (4.6.0) 的 GCC (ppc) 生成具有 6.6K、 的 hugo_46.so
- 来自 Buildroot 2017.08 (7.2.0) 的 GCC (x86) 生成具有 7.5K 的 hugo.so,
- 来自 Buildroot 2017.08 (7.2.0) 的 GCC (ppc) 生成具有 67K 的 hugo.so,
- 来自 Buildroot 2017.08 (6.4.0) 的 GCC (ppc) 生成具有 67K 和 的 hugo.so
- 来自 Buildroot 2017.08 (4.9.4) 的 GCC (ppc) 生成具有 67K 的 hugo.so
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):
- Debian (6.3.0):381 行
- Codesourcery (4.6.0):283 行
- Buildroot 2017.08 (7.2.0):298 行
- Buildroot 2017.08 (6.4.0):294 行
(objdump -s 显示类似的结果)
问题:
- 如何最好地分析 Object 文件中的差异? (objdump、readelf 等)
- 如何最好地分析编译器的差异(例如默认选项)? (例如 -dumpspecs)
- 炸毁共享对象的原因可能是什么?如何增加文件大小?
谢谢!
--
编辑:
它也独立于 GCC 规范。我已经转储 (-dumpspec) 生成小型共享对象的 Codesourcery (4.6.0) GCC 的规范,并将其与 Buildroot GCC (-specs) 一起使用,并再次获得了 67K 共享对象。
【问题讨论】:
-
与您的问题和问题有些无关,但您应该在构建时使用
-fPIC创建目标文件。 -
另外,如果您尝试
strip库,会如何改变大小? -
是的,我只是想让示例保持简单。我遇到了问题,我的 rootfs 从 40Mb 增加到 60Mb,上面的行只是一个例子。
-
您是否对所有运行使用相似的优化级别?即使优化级别相同,不同的编译器也可能运行不同的单独优化,因此没有什么可比较的。具体到这段代码,你可以只看生成的程序集,手动比较有什么不同
-
@Charly,每个编译器都有不同的
-Os定义(你的 gcc 版本也有很大差异)。所以我不会感到惊讶。
标签: c gcc shared-libraries