为什么ld在输出文件中包含未在链接命令文件中指定的部分?

时间:2017-01-06 17:45:21

标签: gcc linker arm ld

我正在努力了解如何使ld(在gcc arm嵌入式工具包中)做我想做的事情:

作为一个例子,我有几个我想要链接的.o文件。说我在输出中需要一个名为.foo的部分。我把它放在命令文件link.ld中:

SECTIONS{
  .foo : {*(.text)}
}

并转到“ld -T link.ld file1.o fil2.o -o output.o”

然后我在output.o上使用objdump并且它只包含输入文件()中的每个部分,并且绝对没有名为.foo的部分这是最令人困惑的部分为什么没有输出中的部分名为.foo?

我已经阅读了这个http://www.scoberlin.de/content/media/http/informatik/gcc_docs/ld_3.html,这一切似乎都是直接的,我只是无法理解为什么这样一个简单的链接器脚本无法实现我想要它做的事情。

我一定错过了一些非常明显的东西;有人可以解释我如何能够准确地控制输出文件中出现哪些部分以及它们被称为什么?

1 个答案:

答案 0 :(得分:1)

嗯,如你所见,你无法如此轻易地控制它。如果你没有明确地链接某些部分"" (在这种情况下,您可以控制顺序,对齐,位置,填充等...),链接器发现所需的其他所有内容都只是放在"之后"。这是一种简化,但这大部分都是这样的。

我认为没有办法告诉链接器只包含 您要求的部分。但有一种方法可以告诉它排除某些部分。但问题是你必须明确要排除的部分。

  

3.6.7输出部分丢弃

     

...

     

特殊输出部分名称/DISCARD/可用于丢弃输入部分。任何输入部分   分配给名为/DISCARD/的输出节的那些不是   包含在输出文件中。

也许这样的事情可行吗?

SECTIONS{
  .foo : {*(.text)}
  /DISCARD/ : {*(*)}
}