diff options
author | Fangrui Song <i@maskray.me> | 2025-08-08 18:40:40 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-08 18:40:40 -0700 |
commit | 6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856 (patch) | |
tree | b7e3d6fa21b68c760b196e8ddb3f0dc074e238ff /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 0c139883f4c086444e816f607105a96b617eb4a7 (diff) | |
download | llvm-6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856.zip llvm-6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856.tar.gz llvm-6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856.tar.bz2 |
[ELF] -r: Synthesize R_RISCV_ALIGN at input section start
Without linker relaxation enabled for a particular relocatable file or
section (e.g., using .option norelax), the assembler will not generate
R_RISCV_ALIGN relocations for alignment directives. This becomes
problematic in a two-stage linking process:
```
ld -r a.o b.o -o ab.o
// b.o is norelax. Its alignment information is lost in ab.o.
ld ab.o -o ab
```
When ab.o is linked into an executable, the preceding relaxed section
(a.o's content) might shrink. Since there's no R_RISCV_ALIGN relocation
in b.o for the linker to act upon, the `.word 0x3a393837` data in b.o
may end up unaligned in the final executable.
To address the issue, this patch inserts NOP bytes and synthesizes an
R_RISCV_ALIGN relocation at the beginning of a text section when the
alignment >= 4.
For simplicity, when RVC is disabled, we synthesize an ALIGN relocation
(addend: 2) for a 4-byte aligned section, allowing the linker to trim
the excess 2 bytes.
See also https://sourceware.org/bugzilla/show_bug.cgi?id=33236
Pull Request: https://github.com/llvm/llvm-project/pull/151639
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions