[llvm] r355696 - [llvm-readelf]Don't lose negative-ness of negative addends for no symbol relocations
    James Henderson via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Mar  8 05:22:06 PST 2019
    
    
  
Author: jhenderson
Date: Fri Mar  8 05:22:05 2019
New Revision: 355696
URL: http://llvm.org/viewvc/llvm-project?rev=355696&view=rev
Log:
[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
Added:
    llvm/trunk/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test
Modified:
    llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
Added: llvm/trunk/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test?rev=355696&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test (added)
+++ llvm/trunk/test/tools/llvm-readobj/elf-reloc-negative-addend-no-sym.test Fri Mar  8 05:22:05 2019
@@ -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
Modified: llvm/trunk/tools/llvm-readobj/ELFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ELFDumper.cpp?rev=355696&r1=355695&r2=355696&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ELFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/ELFDumper.cpp Fri Mar  8 05:22:05 2019
@@ -2730,15 +2730,18 @@ void GNUStyle<ELFT>::printRelocation(con
     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";
 }
 
@@ -3388,17 +3391,18 @@ void GNUStyle<ELFT>::printDynamicRelocat
   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";
 }
 
    
    
More information about the llvm-commits
mailing list