[all-commits] [llvm/llvm-project] 6f53f1: [ELF] -r: Synthesize R_RISCV_ALIGN at input sectio...

Fangrui Song via All-commits all-commits at lists.llvm.org
Fri Aug 8 18:41:07 PDT 2025


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856
      https://github.com/llvm/llvm-project/commit/6f53f1c8d2bdd13e30da7d1b85ed6a3ae4c4a856
  Author: Fangrui Song <i at maskray.me>
  Date:   2025-08-08 (Fri, 08 Aug 2025)

  Changed paths:
    M lld/ELF/Arch/RISCV.cpp
    M lld/ELF/LinkerScript.cpp
    M lld/ELF/OutputSections.cpp
    M lld/ELF/Target.h
    A lld/test/ELF/riscv-relocatable-align.s

  Log Message:
  -----------
  [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



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list