【问题标题】:Why is my shared library much bigger when compiled as position independent code? [closed]为什么我的共享库在编译为与位置无关的代码时要大得多? [关闭]
【发布时间】:2017-09-09 13:57:46
【问题描述】:

我正在编写一个静态链接 SDL2 的共享库。因此,我使用-fPIC 编译了 SDL2 和我的共享库。我注意到,不使用-fPIC,最终共享库大小约为 940 KB,而使用 -fPIC,最终共享库大小约为 1.4 MB。

为什么使用-fPIC 编译的共享库比没有-fPIC 编译的共享库大得多?

测试是在 Raspberry Pi 2 上完成的,因此目标架构是 ARMv7A 或 ARMv8(A)。

【问题讨论】:

  • 旁注:“目标架构是arm”->“ARM”。 ARM 有很多非常不同的架构。 ARMv7A != ARMv7M != ARMv8 等。您的问题无法回答,例如 library-size != code-size。
  • 嗯,我提到我在 Raspberry Pi 2 上进行了测试,所以很明显我说的是 armv7a。我不明白为什么不能回答这个问题。我只想知道为什么在使用-fPIC 时会出现大小爆炸。我认为这是一个非常明确的问题。
  • Rasberry Pi 2 使用了两种截然不同的 ARM 内核:Cortex-A7 和 A53。 A53 实际上不是 ARMv7A,而是 V8(A)!这不是您问题的唯一问题
  • 您的编辑并没有让这个网站变得更好。我给了你很多相关的提示;如果您不了解它们,那么进行一些研究怎么样?您不会在一小时内学习编程,也不会通过勺子喂食。你能指望什么?水晶球?查机器码,objdump显示什么不清楚?你自己检查有什么问题?了解如何使用您拥有的工具并使用它们,它们可以告诉您您需要知道的一切。
  • 根据架构的不同,使代码与位置无关会产生开销。我不认为增加 30% 是值得警惕的。如果你真的很好奇,构建一个两种形式的最小库,然后查看反汇编。

标签: c gcc compilation


【解决方案1】:

简单地说:使代码与位置无关会产生开销。

在非位置无关代码中,编译器可以在访问全局数据时简单地发出对固定地址的引用。使用 PIC,通常涉及一个全局偏移表 (GOT);编译器必须发出额外的代码才能首先访问 GOT。对其他函数的引用也是如此;使用 PIC,这些调用会通过过程查找表 (PLT)。

这种额外的间接级别会导致必要的大小增加。

【讨论】:

  • 为什么这被否决了?这是一个简单问题的准确答案。
  • 我投了赞成票。我实际上对我的问题引起的大惊小怪感到完全困惑。我什至不知道所有的敌意和侵略来自哪里。但是非常感谢您的回答!表明 Stack Overflow 上仍有乐于助人的精神,而不是仅仅告诉所有人使用 RTFM。当然,关于 SO 的 50% 问题可能可以通过 RTFM 解决,但我仍然认为当人们基本上只想知道 PIC 是否大于非 PIC 时,告诉他们“检查机器代码”(Olaf) 有点矫枉过正.正如你所说,这是一个简单的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多