LLVM cross-compiled Linux From Scratch: Bootable kernel and initramfs
本文章是LLVM编译Linux系统的第二篇文章,介绍如何使用LLVM/Clang/musl工具链编译一个可以启动的Linux内核.
本文章是LLVM编译Linux系统的第二篇文章,介绍如何使用LLVM/Clang/musl工具链编译一个可以启动的Linux内核.
本系列文章将介绍如何使用LLVM工具链组装一个可用的Linux发行版. 本文已经更新以适应LLVM 13发生的一些变化.
本文假定读者可以熟练的使用Unix-like系统,具有一定的C/C++编程能力,具有编译开源软件的经验.
工具链,即一套具有工作顺序,可以编译出软件的工具.某些教科书上讲的"编译->汇编->链接"这一过程就粗略的描述了工具链的工作过程.
广义上讲,工具链除了编译期,汇编器,链接器还包含一些所有程序都会使用的库.
GNU工具链和LLVM工具链的对比:
项目 | GNU工具链 | LLVM工具链 |
---|---|---|
C 编译器 | gcc | clang |
C++编译器 | g++ | clang++ |
binutils | GNU binutils | LLVM binutils |
汇编器 | GNU as | 集成汇编器 |
链接器 | ld.bfd , ld.gold | LLVM linker ld.lld |
运行时(intrinsics) | libgcc | compiler-rt |
原子操作 | libatomic | compiler-rt |
C 语言库 | GNU libc glibc | LLVM libc |
C++ 标准库 | libstdc++ | libc++ |
C++ ABI | Libsupcxx | libc++abi |
栈展开(unwind) | libgcc_s | LLVM libunwind |
最近在一台48核96线程的服务器上编译chromium, 使用LLVM12全家桶(Clang, lld), 开启了lto, 发现在链接最终的二进制文件chromium时, lld虽然占用了所有的CPU资源, 但是大量CPU占用是发生在内核态的(使用htop可以看到CPU占用条一半以上是红色的), 因此对lld的性能进行了一些分析, 发现了lld为何在在内核态占用大量的CPU资源.
本文将翻译Xbox Live团队Xbox One安全系统架构师Tony Chen在2019年平台安全峰会(Platform Security Summit 2019, PSEC 2019)上的演讲
PSEC 2019官方页面, 内附演讲视频: 抵御物理攻击, Xbox one的故事(Guarding Against Physical Attacks: The Xbox One Story)
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.
众所周知,微信并没有官方开发的Linux客户端,要想在Linux上使用微信,就产生了很多种变通方法:
在这些解决方案中,微信 PC版在操作逻辑和功能上较其他方案更强,但是由于微信 win32程序会创建一个独立的半透明的窗口作为其窗口边框和UI控件的阴影特效,而在Linux下,Wine会将这个透明的窗口错误的绘制,产生一些奇怪的bug, 例如这个透明边框总是悬浮在所有窗口的最上面,即使已经切换到其他的工作区,或者由于Xwayland的背景是黑色的,这个半透明的窗口会继承黑色的背景,导致其效果不再是一个阴影框,而是一个覆盖整个窗口的黑色块。
本文探讨一下Rust的crate类型的概念, 以及如何在Rust中使用动态链接编译动态库. 同时对比rust编译出的动态库和使用C语言接口动态库, 看看rust动态库是否能实现C语言接口动态库的功能.
要想编译一个rust的可执行程序, 必须在crate顶层定义main
函数. main
函数没有参数, 没有trait或生命周期修饰, 返回值为()
(或者不写返回值类型), !
, Result<(), E> where E: Error
或其他实现std::process::Termination Trait的类型.
虽然大多数情况下rust的用户只需要老实的写一个main
函数就能让他们的程序跑起来了,但是总有一些奇怪的情况使得bin
类型的crate没有rust要求的main
函数`.