Skip to content

Commit a8f9f08

Browse files
committed
[ELF] Set SHF_INFO_LINK for .rel[a].plt and .rel[a].dyn
The ELF spec says > If the sh_flags field for this section header includes the attribute SHF_INFO_LINK, then this member represents a section header table index. Set SHF_INFO_LINK so that binary manipulation tools know that sh_info is a section header table index instead of (the number of local symbols in the case of SHT_SYMTAB/SHT_DYNSYM). We have already added SHF_INFO_LINK for --emit-relocs retained SHT_REL[A]. For example, we can teach llvm-objcopy to preserve the section index of the sh_info referenced section if SHF_INFO_LINK is set. (GNU objcopy recognizes .rel[a].plt and updates sh_info even if SHF_INFO_LINK is not set). Reviewed By: grimar, psmith Differential Revision: https://reviews.llvm.org/D89828
1 parent 5dc7033 commit a8f9f08

File tree

8 files changed

+13
-2
lines changed

8 files changed

+13
-2
lines changed

lld/ELF/SyntheticSections.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,10 +1610,14 @@ void RelocationBaseSection::finalizeContents() {
16101610
else
16111611
getParent()->link = 0;
16121612

1613-
if (in.relaPlt == this)
1613+
if (in.relaPlt == this) {
1614+
getParent()->flags |= ELF::SHF_INFO_LINK;
16141615
getParent()->info = in.gotPlt->getParent()->sectionIndex;
1615-
if (in.relaIplt == this)
1616+
}
1617+
if (in.relaIplt == this) {
1618+
getParent()->flags |= ELF::SHF_INFO_LINK;
16161619
getParent()->info = in.igotPlt->getParent()->sectionIndex;
1620+
}
16171621
}
16181622

16191623
RelrBaseSection::RelrBaseSection()

lld/test/ELF/aarch64-gnu-ifunc.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// CHECK-NEXT: Type: SHT_RELA
1212
// CHECK-NEXT: Flags [
1313
// CHECK-NEXT: SHF_ALLOC
14+
// CHECK-NEXT: SHF_INFO_LINK
1415
// CHECK-NEXT: ]
1516
// CHECK-NEXT: Address: [[RELA:.*]]
1617
// CHECK-NEXT: Offset: 0x158

lld/test/ELF/arm-combined-dynrel-ifunc.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ main:
4040
// CHECK-NEXT: Type: SHT_REL
4141
// CHECK-NEXT: Flags [
4242
// CHECK-NEXT: SHF_ALLOC
43+
// CHECK-NEXT: SHF_INFO_LINK
4344
// CHECK-NEXT: ]
4445
// CHECK-NEXT: Address:
4546
// CHECK-NEXT: Offset:

lld/test/ELF/arm-gnu-ifunc.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ _start:
3131
// CHECK-NEXT: Type: SHT_REL
3232
// CHECK-NEXT: Flags [
3333
// CHECK-NEXT: SHF_ALLOC
34+
// CHECK-NEXT: SHF_INFO_LINK
3435
// CHECK-NEXT: ]
3536
// CHECK-NEXT: Address: 0x100F4
3637
// CHECK-NEXT: Offset: 0xF4

lld/test/ELF/dynamic-reloc.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// CHECK-NEXT: Type: SHT_RELA
1414
// CHECK-NEXT: Flags [
1515
// CHECK-NEXT: SHF_ALLOC
16+
// CHECK-NEXT: SHF_INFO_LINK
1617
// CHECK-NEXT: ]
1718
// CHECK-NEXT: Address: [[RELAADDR:.*]]
1819
// CHECK-NEXT: Offset:

lld/test/ELF/gnu-ifunc-i386.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// CHECK-NEXT: Type: SHT_REL
1212
// CHECK-NEXT: Flags [
1313
// CHECK-NEXT: SHF_ALLOC
14+
// CHECK-NEXT: SHF_INFO_LINK
1415
// CHECK-NEXT: ]
1516
// CHECK-NEXT: Address: [[RELA:.*]]
1617
// CHECK-NEXT: Offset: 0xD4

lld/test/ELF/gnu-ifunc.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
// CHECK-NEXT: Type: SHT_RELA
1212
// CHECK-NEXT: Flags [
1313
// CHECK-NEXT: SHF_ALLOC
14+
// CHECK-NEXT: SHF_INFO_LINK
1415
// CHECK-NEXT: ]
1516
// CHECK-NEXT: Address: [[RELA:.*]]
1617
// CHECK-NEXT: Offset: 0x158

lld/test/ELF/x86-64-combined-dynrel.s

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ _start:
3131
# CHECK-NEXT: Type: SHT_RELA
3232
# CHECK-NEXT: Flags [
3333
# CHECK-NEXT: SHF_ALLOC
34+
# CHECK-NEXT: SHF_INFO_LINK
3435
# CHECK-NEXT: ]
3536
# CHECK-NEXT: Address:
3637
# CHECK-NEXT: Offset:

0 commit comments

Comments
 (0)