Skip to content

Instantly share code, notes, and snippets.

View MaskRay's full-sized avatar
🏠
Working from home. Need food

Fangrui Song MaskRay

🏠
Working from home. Need food
View GitHub Profile
@MaskRay
MaskRay / README.md
Created June 5, 2025 06:21
Debug ld.lld's spurious "address assignment did not converge" error

llvm/llvm-project#113838 "[RISCV] ld.lld: error: relaxation not converged with openssl"

ld.lld @response.txt --noinhibit-exec -o out.30
S=1 ld.lld @response.txt --noinhibit-exec -o out.31
@MaskRay
MaskRay / fix.py
Created November 16, 2024 20:14
lld/ELF: replace log(...) with `Log(ctx) << `
#!/usr/bin/env python
import os, re, sys
from ipdb import set_trace as bp
X = 'log'
Y = 'Log'
def update(lines):
ret = []
s = 0
@MaskRay
MaskRay / arm.log
Last active August 14, 2024 06:50
.macro argument parsing in the Linux kernel
linux/arch/arm/mach-rockchip/sleep.S:20:23: error: too many positional arguments
setmode 0x00000080 | 0x00000040 | 0x00000013, r1 @ set svc, irqs off
^
make[5]: *** [linux/scripts/Makefile.build:362: arch/arm/mach-rockchip/sleep.o] Error 1
make[5]: Target 'arch/arm/mach-rockchip/' not remade because of errors.
make[4]: *** [linux/scripts/Makefile.build:485: arch/arm/mach-rockchip] Error 2
linux/arch/arm/mach-tegra/sleep.S:127:23: error: too many positional arguments
mov32 r2, 0x50040000 + 0x3000
^
linux/arch/arm/mach-tegra/reset-handler.S:95:23: error: too many positional arguments
@MaskRay
MaskRay / fdpic-no-plt.md
Created February 24, 2024 02:47
FDPIC -fno-plt
void f0(void);
void f1(void);
void f2(void);
void g() { f0(); f1(); f2(); }
g:
  push    {r4, lr}
  mov     r4, r9
  bl      f(PLT)
 mov r9, r4
@MaskRay
MaskRay / fix.py
Created February 20, 2024 05:32
Script used to help fix tests for https://github.com/llvm/llvm-project/pull/81037 ("[Driver] Improve error when a compiler-rt library is not found")
#!/usr/bin/env python
import os, re, subprocess, sys
from ipdb import set_trace as bp
def main(filename):
last = 0
while 1:
p = subprocess.run(['/tmp/Rel/bin/llvm-lit', '-v', filename], capture_output=True)
if p.returncode != 1: break
lines = p.stdout.decode().split('\n')
@MaskRay
MaskRay / abis-for-mmu-less-systems
Created February 18, 2024 05:18
ABIs for MMU-less systems
## Linux binfmt loaders
`fs/Kconfig.binfmt` defines a few loaders.
* `BINFMT_ELF` defaults to y and depends on `MMU`.
* `BINFMT_ELF_FDPIC` defaults to y when `BINFMT_ELF` is not selected. A few architecture support `BINFMT_ELF_FDPIC` for NOMMU. ARM supports FDPIC even with a MMU.
* `BINFMT_FLAT` is provided for a few architectures.
`BINFMT_AOUT`, removed in 2022, had been supported for alpha/arm/x86-32.
@MaskRay
MaskRay / typescript
Last active January 26, 2024 01:02
lld's -z separate-code
% echo 'int main(){}' > a.cc
% clang -fuse-ld=lld a.cc -z separate-code
% readelf -WSl a.out
There are 30 section headers, starting at offset 0x2868:
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 00000000000002a8 0002a8 00001c 00 A 0 0 1
[ 2] .note.ABI-tag NOTE 00000000000002c4 0002c4 000020 00 A 0 0 4
@MaskRay
MaskRay / riscv-tlsdesc.md
Last active January 23, 2024 09:02
RISC-V TLSDESC works! clang, lld, musl
@MaskRay
MaskRay / jump-table.sh
Created January 18, 2024 02:46
Arm Branch Target Identification/Intel CET & jump table
PATH=/tmp/Rel/bin:$PATH
cat > switch.cc <<e
#define DO A(0) A(1) A(2) A(3) A(4) A(5) A(6) A(7) A(8) A(9) A(10) A(11) A(12) A(13)
#define A(i) void bar##i();
DO
#undef A
void ext();
void foo(int i) {
switch (i) {
#define A(i) case i: bar##i(); break;
@MaskRay
MaskRay / .config
Created January 13, 2024 09:17
.config for THP experiments
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.7.0 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (Debian 13.2.0-5) 13.2.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=130200
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=24100