- patch debugedit so that it also handles the .debug.macro section

OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=426
This commit is contained in:
Michael Schröder 2017-12-15 12:29:01 +00:00 committed by Git OBS Bridge
parent 387ac01cee
commit dd9ebc05d7
3 changed files with 102 additions and 1 deletions

94
debugedit-macro.diff Normal file
View File

@ -0,0 +1,94 @@
--- ./tools/debugedit.c.orig 2017-12-15 12:17:02.564975374 +0000
+++ ./tools/debugedit.c 2017-12-15 12:17:29.058901941 +0000
@@ -71,6 +71,14 @@
#define DW_FORM_ref_udata 0x15
#define DW_FORM_indirect 0x16
+#define DW_MACRO_GNU_define 1
+#define DW_MACRO_GNU_undef 2
+#define DW_MACRO_GNU_start_file 3
+#define DW_MACRO_GNU_end_file 4
+#define DW_MACRO_GNU_define_indirect 5
+#define DW_MACRO_GNU_undef_indirect 6
+#define DW_MACRO_GNU_transparent_include 7
+
/* Unfortunately strtab manipulation functions were only officially added
to elfutils libdw in 0.167. Before that there were internal unsupported
ebl variants. While libebl.h isn't supported we'll try to use it anyway
@@ -2209,6 +2217,67 @@ edit_dwarf2 (DSO *dso)
}
}
+ /* the macro section also contains offsets into the str section,
+ * so we need to update those as well if we update the strings
+ */
+ if (need_strp_update && debug_sections[DEBUG_MACRO].data)
+ {
+ ptr = debug_sections[DEBUG_MACRO].data;
+ endsec = ptr + debug_sections[DEBUG_MACRO].size;
+ int op = 0, macro_version, macro_flags;
+
+ while (ptr < endsec)
+ {
+ if (!op)
+ {
+ macro_version = read_16 (ptr);
+ macro_flags = read_8 (ptr);
+ if (macro_version != 4 || (macro_flags & ~2) != 0)
+ error (1, 0, "unhandled .debug_macro version/flags");
+ if ((macro_flags & 2) != 0)
+ ptr += 4;
+ }
+ op = read_8 (ptr);
+ if (!op)
+ continue;
+ switch(op)
+ {
+ case DW_MACRO_GNU_define:
+ case DW_MACRO_GNU_undef:
+ read_uleb128 (ptr);
+ ptr = (unsigned char *) strchr ((char *) ptr, '\0') + 1;
+ break;
+ case DW_MACRO_GNU_start_file:
+ read_uleb128 (ptr);
+ read_uleb128 (ptr);
+ break;
+ case DW_MACRO_GNU_define_indirect:
+ case DW_MACRO_GNU_undef_indirect:
+ read_uleb128 (ptr);
+ if (phase == 0)
+ {
+ size_t idx = read_32 (ptr);
+ record_existing_string_entry_idx (&dso->strings, idx);
+ }
+ else
+ {
+ struct stridxentry *entry;
+ size_t idx, new_idx;
+ idx = do_read_32 (ptr);
+ entry = string_find_entry (&dso->strings, idx);
+ new_idx = strent_offset (entry->entry);
+ write_32 (ptr, new_idx);
+ }
+ break;
+ case DW_MACRO_GNU_transparent_include:
+ ptr += 4;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
/* Same for the debug_str section. Make sure everything is
in place for phase 1 updating of debug_info
references. */
@@ -2238,6 +2307,8 @@ edit_dwarf2 (DSO *dso)
new strp, strings and/or linep offsets. */
if (need_strp_update || need_string_replacement || need_stmt_update)
dirty_section (DEBUG_INFO);
+ if (need_strp_update)
+ dirty_section (DEBUG_MACRO);
/* Update any debug_info relocations addends we might have touched. */
if (relbuf != NULL && reltype == SHT_RELA)

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri Dec 15 13:18:39 CET 2017 - mls@suse.de
- patch debugedit so that it also handles the .debug.macro section
new patch: debugedit-macro.diff
-------------------------------------------------------------------
Thu Dec 7 17:02:52 CET 2017 - mls@suse.de

View File

@ -131,6 +131,7 @@ Patch104: editdwarf.diff
Patch105: rofs.diff
Patch106: transfiletriggerpostun.diff
Patch107: hardlink.diff
Patch108: debugedit-macro.diff
Patch6464: auto-config-update-aarch64-ppc64le.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#
@ -226,7 +227,7 @@ rm -f rpmdb/db.h
%patch -P 70 -P 71 -P 73 -P 74 -P 75 -P 77 -P 78
%patch -P 85
%patch -P 93 -P 94 -P 99
%patch -P 100 -P 102 -P 103 -P 104 -P 105 -P 106 -P 107
%patch -P 100 -P 102 -P 103 -P 104 -P 105 -P 106 -P 107 -P 108
%ifarch aarch64 ppc64le
%patch6464