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