【问题标题】:Size of Shared Object files is huge共享对象文件的大小很大
【发布时间】: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

代码取自eli.thegreenplace.net:

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 显示类似的结果)

问题

  1. 如何最好地分析 Object 文件中的差异? (objdump、readelf 等)
  2. 如何最好地分析编译器的差异(例如默认选项)? (例如 -dumpspecs)
  3. 炸毁共享对象的原因可能是什么?如何增加文件大小?

谢谢!

-- 编辑: 它也独立于 GCC 规范。我已经转储 (-dumpspec) 生成小型共享对象的 Codesourcery (4.6.0) GCC 的规范,并将其与 Buildroot GCC (-specs) 一起使用,并再次获得了 67K 共享对象。

【问题讨论】:

  • 与您的问题和问题有些无关,但您应该在构建时使用-fPIC 创建目标文件。
  • 另外,如果您尝试strip 库,会如何改变大小?
  • 是的,我只是想让示例保持简单。我遇到了问题,我的 rootfs 从 40Mb 增加到 60Mb,上面的行只是一个例子。
  • 您是否对所有运行使用相似的优化级别?即使优化级别相同,不同的编译器也可能运行不同的单独优化,因此没有什么可比较的。具体到这段代码,你可以只看生成的程序集,手动比较有什么不同
  • @Charly,每个编译器都有不同的 -Os 定义(你的 gcc 版本也有很大差异)。所以我不会感到惊讶。

标签: c gcc shared-libraries


【解决方案1】:

来自How to reduce ELF section padding?

看起来这是由于 binutils 2.27 将 PowerPC 目标的默认页面大小增加到 64k,导致嵌入式平台上的二进制文件臃肿。

这里有关于crosstool-NG github的讨论。

使用 --disable-relro 配置 binutils 应该会有所改善。

你也可以在编译的时候在gcc中加上-Wl,-z,max-page-size=0x1000。

在我的 buildroot 配置中添加 BR2_BINUTILS_EXTRA_CONFIG_OPTIONS="--disable-relro" 时,共享对象的大小会减小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多