[binutils-gdb] dwarf2: Align relocation within .debug_line section

Alan Modra amodra@sourceware.org
Wed Mar 13 04:25:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=204f543cae7a5dc908264b49d558191d0ceb989c

commit 204f543cae7a5dc908264b49d558191d0ceb989c
Author: Christian Eggers <ceggers@gmx.de>
Date:   Sun Mar 10 19:21:58 2019 +0100

    dwarf2: Align relocation within .debug_line section
    
    All relocations specify a byte address.  As dwarf debug information is
    organized in octets, some relocations may not be aligned.  While it
    might be possible to define special relocations that operate at an
    octet offset from their address, it's easier to ensure the relocations
    are aligned by padding with "nop" statements.
    
    In most dwarf sections this requirement is already fulfilled, only
    relocations for symbol address within the .debug_line section can be
    misaligned.
    
    	* dwarf2dbg.c (out_set_addr): Align relocation within .debug_line.

Diff:
---
 gas/ChangeLog   |  4 ++++
 gas/dwarf2dbg.c | 18 +++++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5b20974..d08c096 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,9 @@
 2019-03-13  Christian Eggers  <ceggers@gmx.de>
 
+	* dwarf2dbg.c (out_set_addr): Align relocation within .debug_line.
+
+2019-03-13  Christian Eggers  <ceggers@gmx.de>
+
 	* dwarf2dbg.c (out_debug_line): Pad size of .debug_line section.
 
 2019-03-13  Christian Eggers  <ceggers@gmx.de>
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index 0b7b78c..2d316dd 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -1109,15 +1109,27 @@ get_frag_fix (fragS *frag, segT seg)
 /* Set an absolute address (may result in a relocation entry).  */
 
 static void
+out_inc_line_addr (int line_delta, addressT addr_delta);
+
+static void
 out_set_addr (symbolS *sym)
 {
   expressionS exp;
+  addressT expr_addr, expr_addr_aligned;
 
   memset (&exp, 0, sizeof exp);
-  out_opcode (DW_LNS_extended_op);
-  out_uleb128 (sizeof_address + 1);
 
-  out_opcode (DW_LNE_set_address);
+  /* The expression at the bottom must be aligned to OCTETS_PER_BYTE.  The
+     statements after the for loop will contribute 3 more octets.  */
+  expr_addr = frag_now_fix_octets () + 3;
+  expr_addr_aligned = (expr_addr + OCTETS_PER_BYTE - 1) & -OCTETS_PER_BYTE;
+  for ( ; expr_addr != expr_addr_aligned; expr_addr++)
+    out_inc_line_addr (0, 0);  /* NOP */
+
+  out_opcode (DW_LNS_extended_op);   /* 1 octet */
+  out_uleb128 (sizeof_address + 1);  /* 1 octet */
+
+  out_opcode (DW_LNE_set_address);   /* 1 octet */
   exp.X_op = O_symbol;
   exp.X_add_symbol = sym;
   exp.X_add_number = 0;



More information about the Binutils-cvs mailing list