LLVM cross-compiled Linux From Scratch: C & C++ libraries

本系列文章将介绍如何使用LLVM工具链组装一个可用的Linux发行版. 本文已经更新以适应LLVM 13发生的一些变化.

面向读者

本文假定读者可以熟练的使用Unix-like系统,具有一定的C/C++编程能力,具有编译开源软件的经验.

什么是工具链

工具链,即一套具有工作顺序,可以编译出软件的工具.某些教科书上讲的"编译->汇编->链接"这一过程就粗略的描述了工具链的工作过程.

广义上讲,工具链除了编译期,汇编器,链接器还包含一些所有程序都会使用的库.

GNU工具链和LLVM工具链的对比:

项目GNU工具链LLVM工具链
C 编译器gccclang
C++编译器g++clang++
binutilsGNU binutilsLLVM binutils
汇编器GNU as集成汇编器
链接器ld.bfd, ld.goldLLVM linker ld.lld
运行时(intrinsics)libgcccompiler-rt
原子操作libatomiccompiler-rt
C 语言库GNU libc glibcLLVM libc
C++ 标准库libstdc++libc++
C++ ABILibsupcxxlibc++abi
栈展开(unwind)libgcc_sLLVM libunwind

lld为什么在多核CPU上这么慢

最近在一台48核96线程的服务器上编译chromium, 使用LLVM12全家桶(Clang, lld), 开启了lto, 发现在链接最终的二进制文件chromium时, lld虽然占用了所有的CPU资源, 但是大量CPU占用是发生在内核态的(使用htop可以看到CPU占用条一半以上是红色的), 因此对lld的性能进行了一些分析, 发现了lld为何在在内核态占用大量的CPU资源.

Using sccache on gentoo

Firest please fellow the page of Sccache on Gentoo wiki.

After the installation and configuration of sccache, you can try to compile some rust packages. It may work fine for the first one, but later you may find some weird sandbox or permission error like "sccache: error : Failed to create temp dir ..." or "sccache: caused by: Permission denied (os error 13)"

Let's fix this issue.

屏蔽微信在Wine中运行时产生的水印/黑块(Linux Edition)

众所周知,微信并没有官方开发的Linux客户端,要想在Linux上使用微信,就产生了很多种变通方法:

  • 网页版
  • Wine+微信 PC版
  • 虚拟机+微信 PC版
  • Android虚拟机/容器+微信平板模式
  • 在其他设备上使用,并使用RDP/scrcpy等软件远程控制

在这些解决方案中,微信 PC版在操作逻辑和功能上较其他方案更强,但是由于微信 win32程序会创建一个独立的半透明的窗口作为其窗口边框和UI控件的阴影特效,而在Linux下,Wine会将这个透明的窗口错误的绘制,产生一些奇怪的bug, 例如这个透明边框总是悬浮在所有窗口的最上面,即使已经切换到其他的工作区,或者由于Xwayland的背景是黑色的,这个半透明的窗口会继承黑色的背景,导致其效果不再是一个阴影框,而是一个覆盖整个窗口的黑色块。

Rust动态链接

本文探讨一下Rust的crate类型的概念, 以及如何在Rust中使用动态链接编译动态库. 同时对比rust编译出的动态库和使用C语言接口动态库, 看看rust动态库是否能实现C语言接口动态库的功能.

什么, 你不喜欢main函数?

要想编译一个rust的可执行程序, 必须在crate顶层定义main函数. main函数没有参数, 没有trait或生命周期修饰, 返回值为()(或者不写返回值类型), !, Result<(), E> where E: Error或其他实现std::process::Termination Trait的类型.

虽然大多数情况下rust的用户只需要老实的写一个main函数就能让他们的程序跑起来了,但是总有一些奇怪的情况使得bin类型的crate没有rust要求的main函数`.