[llvm-readelf]Don't lose negative-ness of negative addends for no symbol relocations

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

llvm-svn: 355696
This commit is contained in:
James Henderson 2019-03-08 13:22:05 +00:00
parent 6bce2f8ee5
commit b41130bedc
2 changed files with 95 additions and 17 deletions

View File

@ -0,0 +1,74 @@
# 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

View File

@ -2730,15 +2730,18 @@ void GNUStyle<ELFT>::printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,
printField(F); printField(F);
std::string Addend; std::string Addend;
if (Sym && IsRela) { if (IsRela) {
if (R.r_addend < 0) int64_t RelAddend = R.r_addend;
Addend = " - "; if (Sym) {
else if (R.r_addend < 0) {
Addend = " + "; Addend = " - ";
} RelAddend = std::abs(RelAddend);
} else
Addend = " + ";
}
if (IsRela) Addend += to_hexString(RelAddend, false);
Addend += to_hexString(std::abs(R.r_addend), false); }
OS << Addend << "\n"; OS << Addend << "\n";
} }
@ -3388,17 +3391,18 @@ void GNUStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela R,
for (auto &Field : Fields) for (auto &Field : Fields)
printField(Field); printField(Field);
int64_t RelAddend = R.r_addend;
std::string Addend; std::string Addend;
if (!SymbolName.empty() && IsRela) { if (IsRela) {
if (R.r_addend < 0) int64_t RelAddend = R.r_addend;
Addend = " - "; if (!SymbolName.empty()) {
else if (R.r_addend < 0) {
Addend = " + "; 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"; OS << Addend << "\n";
} }