专业的编程技术博客社区

网站首页 > 博客文章 正文

ziglang深入理解-Zig 与 libc 一起发布

baijin 2024-09-17 12:20:08 博客文章 6 ℃ 0 评论

你可以通过 zig targets 命令获得可用的libc目标:

...
 "libc": [
  "aarch64_be-linux-gnu",
  "aarch64_be-linux-musl",
  "aarch64_be-windows-gnu",
  "aarch64-linux-gnu",
  "aarch64-linux-musl",
  "aarch64-windows-gnu",
  "armeb-linux-gnueabi",
  "armeb-linux-gnueabihf",
  "armeb-linux-musleabi",
  "armeb-linux-musleabihf",
  "armeb-windows-gnu",
  "arm-linux-gnueabi",
  "arm-linux-gnueabihf",
  "arm-linux-musleabi",
  "arm-linux-musleabihf",
  "arm-windows-gnu",
  "i386-linux-gnu",
  "i386-linux-musl",
  "i386-windows-gnu",
  "mips64el-linux-gnuabi64",
  "mips64el-linux-gnuabin32",
  "mips64el-linux-musl",
  "mips64-linux-gnuabi64",
  "mips64-linux-gnuabin32",
  "mips64-linux-musl",
  "mipsel-linux-gnu",
  "mipsel-linux-musl",
  "mips-linux-gnu",
  "mips-linux-musl",
  "powerpc64le-linux-gnu",
  "powerpc64le-linux-musl",
  "powerpc64-linux-gnu",
  "powerpc64-linux-musl",
  "powerpc-linux-gnu",
  "powerpc-linux-musl",
  "riscv64-linux-gnu",
  "riscv64-linux-musl",
  "s390x-linux-gnu",
  "s390x-linux-musl",
  "sparc-linux-gnu",
  "sparcv9-linux-gnu",
  "wasm32-freestanding-musl",
  "x86_64-linux-gnu",
  "x86_64-linux-gnux32",
  "x86_64-linux-musl",
  "x86_64-windows-gnu"
 ],

这意味着在这些目标上使用--library c将不依赖任何系统文件

让我们再看看C语言Hello, World例子:

$ zig build-exe hello.c --library c
$ ./hello
Hello world
$ ldd ./hello
	linux-vdso.so.1 (0x00007ffd03dc9000)
	libc.so.6 => /lib/libc.so.6 (0x00007fc4b62be000)
	libm.so.6 => /lib/libm.so.6 (0x00007fc4b5f29000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc4b5d0a000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007fc4b5b06000)
	librt.so.1 => /lib/librt.so.1 (0x00007fc4b58fe000)
	/lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fc4b6672000)

glibc 不支持静态链接,但是 musl 支持:

$ zig build-exe hello.c --library c -target x86_64-linux-musl
$ ./hello
Hello world
$ ldd hello
  not a dynamic executable

在这个例子中,Zig从源码构建musl libc然后将其链接到输出文件中。由于缓存系统,musl libc的缓存仍然有效,所以当再次需要这个libc的时候,它就会被立即使用。

这意味着这个功能可以在任何平台上使用。Windows和MacOS 用户可以为上面列出的任何目标构建Zig和C代码,并与libc链接。同样的代码也可以为其他架构交叉编译:

$ zig build-exe hello.c --library c -target aarch64-linux-gnu
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 2.0.0, with debug_info, not stripped

在某些方面,Zig是比C编译器更好的C编译器!

这个功能不仅仅是将交叉编译工具链与Zig捆绑在一起。例如,Zig提供的libc头文件总大小为22MiB,未压缩。同时,仅 x86_64 上的musl libc+linux头文件就有8MiB,glibc有3.1 MiB(glibc 不包括Linux头文件),然而Zig目前附带的libc有40个。如果是天真的捆绑发布,那就是 444 MiB。然而,多亏了我做的这个 process_headers 工具,以及一些老式的手工劳动,Zig 二进制压缩包的总容量仍然只有 30 MiB,尽管它支持所有这些目标的 libc,以及compiler-rt、libunwind和libcxx,尽管它是一个Clang兼容的C编译器。作为比较,来自 llvm.org 的 clang 8.0.0 本身的 Windows二进制构建有132MiB这么大。

请注意,只有一级支持目标得到了彻底测试。我们有计划增加更多的 libc(包括Windows平台),并提高对所有libc的测试覆盖率。

我们还计划有一个 Zig 包管理器,但还没有完成。其中一个功能是可以为 C 库创建一个包,这将使 Zig 构建系统对 Zig 程序员和 C 程序员都有吸引力。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表