Skip to content

Commit

Permalink
[llvm-readelf]Don't lose negative-ness of negative addends for no sym…
Browse files Browse the repository at this point in the history
…bol 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
  • Loading branch information
jh7370 committed Mar 8, 2019
1 parent 6bce2f8 commit b41130b
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 17 deletions.
74 changes: 74 additions & 0 deletions llvm/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test
@@ -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
38 changes: 21 additions & 17 deletions llvm/tools/llvm-readobj/ELFDumper.cpp
Expand Up @@ -2730,15 +2730,18 @@ void GNUStyle<ELFT>::printRelocation(const ELFO *Obj, const Elf_Shdr *SymTab,
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";
}

Expand Down Expand Up @@ -3388,17 +3391,18 @@ void GNUStyle<ELFT>::printDynamicRelocation(const ELFO *Obj, Elf_Rela R,
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";
}

Expand Down

0 comments on commit b41130b

Please sign in to comment.