<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=LD</id>
	<title>LD - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=LD"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=LD&amp;action=history"/>
	<updated>2026-04-03T22:20:47Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=LD&amp;diff=181&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“{{Stub}} {{Infobox_Tool |name=GNU Linker |website=http://www.gnu.org/software/binutils/ }}  '''GNU链接器 ''' (可执行文件名为 'ld') 是 binutils 包的一部分。 它是Linux和其他类Unix操作系统下的标准链接器。 它支持现有的大多数输入和输出格式 (通过使用libbfd)，据报道它是列出的链接器中最灵活的。  &lt;!-- TODO: 这一段有些语无伦次。 此描述基于ld源，可以编译以支持所有格式…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=LD&amp;diff=181&amp;oldid=prev"/>
		<updated>2022-01-05T02:22:14Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Stub}} {{Infobox_Tool |name=GNU Linker |website=http://www.gnu.org/software/binutils/ }}  &amp;#039;&amp;#039;&amp;#039;GNU链接器 &amp;#039;&amp;#039;&amp;#039; (可执行文件名为 &amp;#039;ld&amp;#039;) 是 &lt;a href=&quot;/index.php?title=Binutils&quot; title=&quot;Binutils&quot;&gt;binutils&lt;/a&gt; 包的一部分。 它是Linux和其他类Unix操作系统下的标准链接器。 它支持现有的大多数输入和输出格式 (通过使用libbfd)，据报道它是列出的链接器中最灵活的。  &amp;lt;!-- TODO: 这一段有些语无伦次。 此描述基于ld源，可以编译以支持所有格式…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Stub}}&lt;br /&gt;
{{Infobox_Tool&lt;br /&gt;
|name=GNU Linker&lt;br /&gt;
|website=http://www.gnu.org/software/binutils/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''GNU链接器 ''' (可执行文件名为 'ld') 是 [[binutils]] 包的一部分。 它是Linux和其他类Unix操作系统下的标准链接器。 它支持现有的大多数输入和输出格式 (通过使用libbfd)，据报道它是列出的链接器中最灵活的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
TODO: 这一段有些语无伦次。&lt;br /&gt;
此描述基于ld源，可以编译以支持所有格式。 请注意，DJGPP随附的ld的输出格式 (DJGPP/COFF，A.Out，flat binary) 以及作为Linux等一部分的ld非常有限。 - you have to ./configure and recompile ld to your requirements.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== 特性 ==&lt;br /&gt;
* 支持大多数已知的输入格式 (ELF、DJGPP/COFF、Win32/COFF、a.out等)&lt;br /&gt;
* 支持大多数已知的输出格式 (ELF，Win32/PE，COFF，a.out等)。&lt;br /&gt;
* 支持创建共享库。&lt;br /&gt;
* 通过灵活的 [[Linker Scripts|Linker Script]] 语言提供对生成输出文件的完全控制。&lt;br /&gt;
* 可以创建flat binary文件。&lt;br /&gt;
* 可以指定代码/数据地址，并具有单独的加载和执行地址 (对于较高的一半内核至关重要)。&lt;br /&gt;
* 支持DWARF、ECOFF和STABS调试信息。&lt;br /&gt;
* GPL version 3证书下的自由软件。&lt;br /&gt;
&lt;br /&gt;
== 用法 ==&lt;br /&gt;
ld无法单独创建共享库。 你必须给编译器适当的标志，以便它可以生成position-independent的代码 (请注意，这只是在谈论ELF共享库)。&lt;br /&gt;
&lt;br /&gt;
ld能够链接，同时在最终对象中保留重定位 (称为 “增量链接”)，并且如果指示这样做，它也可以留下未解决的符号。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
TODO: 这似乎与这篇文章无关。&lt;br /&gt;
在PE方面，您必须使用麻烦的黑客手段来获取ld来生成可重定位的dll。这涉及运行ld三 (!) 次:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ld -s --base-file $(BASE).base --dll -o $(TARGET) $(OBJS) $(LIBS) $(LDFLAGS)&lt;br /&gt;
dlltool --as=as --dllname $(TARGET) $(DTFLAGS) --base-file $(BASE).base --output-exp $(EXP_TEMP)&lt;br /&gt;
ld -s --base-file $(BASE).base --dll -o $(TARGET) $(OBJS) $(LIBS) $(LDFLAGS)&lt;br /&gt;
dlltool --as=as --dllname $(TARGET) $(DTFLAGS) --base-file $(BASE).base --output-exp $(EXP_TEMP)&lt;br /&gt;
ld --dll -o $(TARGET) $(EXP) $(OBJS) $(LIBS) $(LDFLAGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
但是，这通常不是OS开发的问题。&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
你可能还需要了解一下 [[ar]]，一个ld的静态链接库伴侣。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== 使用ld构建模块化操作系统内核 ===&lt;br /&gt;
TODO: 这应该进入它自己的教程&lt;br /&gt;
可以使用ld来构建模块化OS内核，即，将关键功能和/或数据结构导出为动态可链接项的内核，以供其他独立生成的可执行对象 (“模块”) 使用。&lt;br /&gt;
&lt;br /&gt;
要进行设置，您需要执行以下操作:&lt;br /&gt;
* 链接内核映像时，将 “-shared” 标志传递给ld，以生成导出符号的表&lt;br /&gt;
* 传递 “-Bsymbolic” 标志，以确保解析内核符号 (而不是在运行时留给解析)&lt;br /&gt;
* 添加 “-z defs” 标志以确保未定义任何符号&lt;br /&gt;
* 在链接脚本中包括 “.hash”，“.dynsym” 和 “.dynstr” 部分 (按此顺序)&lt;br /&gt;
* 在链接脚本中包含 “.got.plt” 部分，即使未使用 (如果省略链接器错误)&lt;br /&gt;
* 在链接器脚本中使用 'provide_hidden (symbol )'，以避免将 &amp;lt;symbol&amp;gt; 暴露给外部模块&lt;br /&gt;
* 向OS内核添加代码，用于针对内核导出表解析ELF符号&lt;br /&gt;
&lt;br /&gt;
可选地，可以使用 “--hash-style=gnu” 标志来生成更好的优化哈希表结构 (部分 “.gnu.hash”)- see [https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections GNU Hash ELF sections]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
== 另见 ==&lt;br /&gt;
=== 文章 ===&lt;br /&gt;
* [[Object Files]]&lt;br /&gt;
* [[Tool Comparison]]&lt;br /&gt;
* [[Linker Scripts]]&lt;br /&gt;
* [[Wikipedia:GNU linker|GNU linker]] - Wikipedia&lt;br /&gt;
&lt;br /&gt;
=== External Links ===&lt;br /&gt;
* [https://sourceware.org/binutils/docs/ld/ GNU ld official manual]&lt;br /&gt;
&lt;br /&gt;
[[Category:Binutils]]&lt;br /&gt;
[[Category:Linkers]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>