https://sourceware.org/bugzilla/show_bug.cgi?id=32718
Bug ID: 32718
Summary: RISCV - relaxation seem to break static-PIE addressing
Product: binutils
Version: 2.44
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: tprism at gmail dot com
Target Milestone: ---
Consider the code:
--------------------
volatile unsigned temp;
int main(void) {
temp = 0x12345678;
return 0;
}
---------------------
When compiled with
> riscv64-unknown-elf-gcc -nostdlib -nostartfiles -O3 -fpie -static-pie -c
> main.c
it is generating the following (disassembled) object code:
-----------------------------
0000000000000000 <main>:
0: 123457b7 lui a5,0x12345
4: 67878793 addi a5,a5,1656 # 12345678 <main+0x12345678>
8: 00000717 auipc a4,0x0
8: R_RISCV_PCREL_HI20 .LANCHOR0
8: R_RISCV_RELAX *ABS*
c: 00f72023 sw a5,0(a4) # 8 <main+0x8>
c: R_RISCV_PCREL_LO12_S .L0
c: R_RISCV_RELAX *ABS*
10: 4501 li a0,0
12: 8082 ret
--------------------------------
Here the access to `temp` is correctly PC-relative and is using relaxation
However, when compiled and linked with the following script:
----------------------
ENTRY(main)
SECTIONS {
.text : {
*(.text .text.*)
}
.rodata : ALIGN(16) {
*(.srodata .srodata.*)
*(.rodata .rodata.*)
}
.data ALIGN(16): {
_data_start = .;
*(.got .got.*)
*(.sdata .sdata.*)
*(.data .data.*)
}
.bss ALIGN(16): {
_bss_start = .;
*(.sbss .sbss.*)
*(.bss .bss.*)
_bss_end = .;
}
}
--------------------
> riscv64-unknown-elf-gcc -nostdlib -nostartfiles -O3 -fpie -static-pie -T
> link.ld main.c -o main.elf
the disassembled elf looks like this:
0000000000000000 <main>:
0: 123457b7 lui a5,0x12345
4: 67878793 addi a5,a5,1656 # 12345678
<_bss_end+0x12345664>
8: 00f02823 sw a5,16(zero) # 10 <_data_start>
c: 4501 li a0,0
e: 8082 ret
As we can see the access to `temp` is not PC-relative anymore, but for some
reason `zero`-relative.
It seems like this behavior is depending on the "absolute" address of `temp`.
Whenever it is less than 2048, the demonstrated behavior is observed. When it
is greater than that (by aligning `.bss` to higher boundary), correct
PC-relative addressing is generated. `--no-relax` is "fixing" this issue.
--
You are receiving this mail because:
You are on the CC list for the bug.