Module Name:    src
Committed By:   hannken
Date:           Mon Mar  7 14:32:02 UTC 2016

Modified Files:
        src/external/bsd/elftoolchain/dist/libdwarf: libdwarf_elf_init.c

Log Message:
Relocation of type SHT_REL must use the current value as addend.

Fixes ctfconvert for i386 where section .debug_info uses this relocation.

Ok: Christos Zoulas


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c
diff -u src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c:1.3 src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c:1.4
--- src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c:1.3	Sat Feb 20 02:43:41 2016
+++ src/external/bsd/elftoolchain/dist/libdwarf/libdwarf_elf_init.c	Mon Mar  7 14:32:02 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: libdwarf_elf_init.c,v 1.3 2016/02/20 02:43:41 christos Exp $	*/
+/*	$NetBSD: libdwarf_elf_init.c,v 1.4 2016/03/07 14:32:02 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2009 Kai Wang
@@ -28,7 +28,7 @@
 
 #include "_libdwarf.h"
 
-__RCSID("$NetBSD: libdwarf_elf_init.c,v 1.3 2016/02/20 02:43:41 christos Exp $");
+__RCSID("$NetBSD: libdwarf_elf_init.c,v 1.4 2016/03/07 14:32:02 hannken Exp $");
 ELFTC_VCSID("Id: libdwarf_elf_init.c 3161 2015-02-15 21:43:36Z emaste ");
 
 static const char *debug_name[] = {
@@ -54,7 +54,8 @@ static const char *debug_name[] = {
 
 static void
 _dwarf_elf_write_reloc(Dwarf_Debug dbg, Elf_Data *symtab_data, int endian,
-    void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend)
+    void *buf, uint64_t offset, GElf_Xword r_info, GElf_Sxword r_addend,
+    int is_rel)
 {
 	GElf_Sym sym;
 	int size;
@@ -63,6 +64,14 @@ _dwarf_elf_write_reloc(Dwarf_Debug dbg, 
 		return;
 	if ((size = _dwarf_get_reloc_size(dbg, GELF_R_TYPE(r_info))) == 0)
 		return; /* Unknown or non-absolute relocation. */
+	if (is_rel) {
+		uint64_t roffset = offset;
+
+		if (endian == ELFDATA2MSB)
+			r_addend = _dwarf_read_msb(buf, &roffset, size);
+		else
+			r_addend = _dwarf_read_lsb(buf, &roffset, size);
+	}
 	if (endian == ELFDATA2MSB)
 		_dwarf_write_msb(buf, &offset, sym.st_value + r_addend, size);
 	else
@@ -79,7 +88,7 @@ _dwarf_elf_apply_rel_reloc(Dwarf_Debug d
 	j = 0;
 	while (gelf_getrel(rel_data, j++, &rel) != NULL)
 		_dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
-		     rel.r_offset, rel.r_info, 0);
+		     rel.r_offset, rel.r_info, 0, 1);
 }
 
 static void
@@ -92,7 +101,7 @@ _dwarf_elf_apply_rela_reloc(Dwarf_Debug 
 	j = 0;
 	while (gelf_getrela(rel_data, j++, &rela) != NULL)
 		_dwarf_elf_write_reloc(dbg, symtab_data, endian, buf,
-		    rela.r_offset, rela.r_info, rela.r_addend);
+		    rela.r_offset, rela.r_info, rela.r_addend, 0);
 }
 
 static int

Reply via email to