llvm-readelf prints relocation addends as:
<symbol value>[+-]<absolute addend>
where [+-] is determined from whether addend is less than zero or not.
However, it does not print the +/- if there is no symbol, which meant
that negative addends became their positive value with no indication
that this had happened. This patch stops the absolute conversion when
addends are negative and there is no associated symbol.
Reviewed by: Higuoxing, mattd, MaskRay
Differential Revision: https://reviews.llvm.org/D59095
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@355696
91177308-0d34-0410-b5e6-
96231b3b80d8
--- /dev/null
+# Show that llvm-readelf properly prints the addend for relocations that do not
+# have an associated symbol but have a negative addend.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-readelf --relocations %t | FileCheck %s --check-prefix=REL
+# RUN: llvm-readelf --dyn-relocations %t | FileCheck %s --check-prefix=DYN
+
+# REL: Relocation section '.rela.text' at offset {{.*}} contains 1 entries:
+# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# REL-NEXT: 0000000000000000 0000000000000000 R_X86_64_NONE ffffffffffffffff
+# REL-EMPTY:
+# REL-NEXT: Relocation section '.rela.dyn' at offset {{.*}} contains 1 entries:
+# REL-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# REL-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff
+
+# DYN: 'RELA' relocation section at offset {{.*}} contains 24 bytes:
+# DYN-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
+# DYN-NEXT: 0000000000000008 0000000000000000 R_X86_64_NONE ffffffffffffffff
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Size: 0x10
+ - Name: .rela.text
+ Type: SHT_RELA
+ Link: .symtab
+ Info: .text
+ Relocations:
+ - Offset: 0
+ Type: R_X86_64_NONE
+ Addend: -1
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_RELA
+ Value: 0x1100
+ - Tag: DT_RELASZ
+ Value: 24
+ - Tag: DT_RELAENT
+ Value: 24
+ - Tag: DT_NULL
+ Value: 0
+ - Name: .rela.dyn
+ Type: SHT_RELA
+ Flags: [SHF_ALLOC]
+ Info: .text
+ Address: 0x1100
+ AddressAlign: 0x100
+ Relocations:
+ - Offset: 8
+ Type: R_X86_64_NONE
+ Addend: -1
+DynamicSymbols:
+ Global:
+ - Name: force_dynsym
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .rela.dyn
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
printField(F);
std::string Addend;
- if (Sym && IsRela) {
- if (R.r_addend < 0)
- Addend = " - ";
- else
- Addend = " + ";
- }
+ if (IsRela) {
+ int64_t RelAddend = R.r_addend;
+ if (Sym) {
+ if (R.r_addend < 0) {
+ Addend = " - ";
+ RelAddend = std::abs(RelAddend);
+ } else
+ Addend = " + ";
+ }
- if (IsRela)
- Addend += to_hexString(std::abs(R.r_addend), false);
+ Addend += to_hexString(RelAddend, false);
+ }
OS << Addend << "\n";
}
for (auto &Field : Fields)
printField(Field);
- int64_t RelAddend = R.r_addend;
std::string Addend;
- if (!SymbolName.empty() && IsRela) {
- if (R.r_addend < 0)
- Addend = " - ";
- else
- Addend = " + ";
+ if (IsRela) {
+ int64_t RelAddend = R.r_addend;
+ if (!SymbolName.empty()) {
+ if (R.r_addend < 0) {
+ Addend = " - ";
+ RelAddend = std::abs(RelAddend);
+ } else
+ Addend = " + ";
+ }
+ Addend += to_string(format_hex_no_prefix(RelAddend, 1));
}
-
- if (IsRela)
- Addend += to_string(format_hex_no_prefix(std::abs(RelAddend), 1));
OS << Addend << "\n";
}