#linker #compiler #file #kerbal #optimization #shared #symbol

bin+lib klinker

为 kOS 设计的 Kerbal 编译器集合链接器

16 个稳定版本

3.0.2 2022 年 11 月 11 日
3.0.0 2022 年 10 月 27 日
2.0.11 2022 年 10 月 27 日
2.0.10 2021 年 12 月 5 日
1.0.2 2021 年 5 月 1 日

#160 in 操作系统

GPL-3.0 许可证

315KB
2K SLoC

Kerbal 链接器 (kld)

github github License

GitHub Workflow Status Libraries.io dependency status for GitHub repo Crates.io Downloads

Kerbal 链接器,或 KLinker,是一个完全自定义构建的链接器,旨在支持 Kerbal 操作系统的编译工具链开发。KLinker 将 KerbalObject 文件链接到 KerboScript 机器码文件,这些文件可以在 kOS 中运行。

为了能够检查该程序所消耗和输出的文件,创建了工具 kDump

如果提供符合 KerbalObject 文件格式的规范 规范 的合规 KerbalObject 文件,则此链接器可以成功创建可执行文件和共享库。这些 KerbalObject 文件可以由任何生成它们的汇编器或编译器创建,例如 Kerbal Assembler

功能

  • 符号重定位
  • 本地符号支持
  • 链接时文件大小优化

安装

Kerbal 链接器可以通过 cargo 通过 crates.io 安装,也可以作为独立二进制文件安装。

Windows

  • 从右侧的发行版下载 .msi 文件
  • 运行安装程序
  • kld 应已添加到您的 PATH,并可在任何 CMD 或 Powershell 窗口中使用

Arch Linux

  • 从右侧的发行版下载 PKGBUILD

  • 将其复制到临时文件夹中

  • 运行 makepkg -si 安装 klinker 及其所有依赖项。

  • kld 应已添加到您的 PATH,并可在任何终端中使用

独立可执行文件

  • 从右侧的发行版下载并解压缩 .zip 文件
  • 将可执行文件放置在所需的位置
  • 通过终端、Windows 上的 Powershell 或 Mac OS 或 Linux 的默认终端运行可执行文件。

Cargo

cargo install klinker

kld 应已添加到您的 shell 的 PATH,并可在任何终端中运行

用法

安装后,可以通过 kld 调用 Kerbal 链接器

可以通过运行以下命令从程序本身访问帮助

kld --help

klc 参数的基本格式为

kld [FLAGS] [OPTIONS] <INPUT>... -o <OUTPUT PATH>

运行 kld 时,链接器无法推断输出文件名,因此必须始终指定一个。这可以通过向 kld 传递 -o 标志来完成

kld -o myprogram.ksm

如果输出路径不以 .ksm 结尾,kld 将尝试添加它。

kld 可以一次接收多个文件作为输入,多个输入文件以空格分隔的路径输入

kld librocket.ko mathlib.ko main.ko -o launch.ksm

可以通过指定 -s 标志将链接器置于共享库模式。此模式只需要存在 _init 函数。

kld libdock.ko librendezv.ko -o docking.ksm

该文件不能直接运行,而应该从另一个程序加载。

kld 还允许用户指定程序的入口点,或程序启动运行的函数。默认情况下,这是 _start 函数。可以通过使用 -e 标志来更改它

kld -e __main__ main.ko -o program.ksm

这将使链接器搜索名为 "__main__" 的函数,然后创建 KSM 文件,以便程序启动时运行该代码。

注意

Kerbal Linker 当前使用链接时文件大小优化。如果特定情况下认为其操作不受欢迎,则可能可以通过命令行标志禁用此功能。目前,这是通过找出所有 KerbalObject 文件内部哪些函数实际上被代码引用,该代码可能有运行的可能性来实现的。如果一个函数在任何被引用的地方都没有被引用,则该函数不会包含在最终的 KSM 文件中。这意味着对于诸如程序语言的库这样的代码,几乎从未完全使用,文件大小不会非常大。

这与 kOS 内部的 KerboScript 的工作方式形成对比,因为 KerboScript 代码都是通过运行其他脚本在运行时加载的,所有代码都必须存在,这意味着可以编译并转换为 KerbalObject 文件的任何代码可以比等效的 KerboScript 库小得多。

依赖项

~1.8–2.5MB
~44K SLoC