| Index: rpm/tools/debugedit.c |
| RCS File: /v/rpm/cvs/rpm/tools/debugedit.c,v |
| rcsdiff -q -kk '-r2.21' '-r2.22' -u '/v/rpm/cvs/rpm/tools/debugedit.c,v' 2>/dev/null |
| --- debugedit.c 2008/12/25 17:21:43 2.21 |
| +++ debugedit.c 2009/06/15 14:16:21 2.22 |
| @@ -1,4 +1,4 @@ |
| -/* Copyright (C) 2001, 2002, 2003, 2005, 2007 Red Hat, Inc. |
| +/* Copyright (C) 2001, 2002, 2003, 2005, 2007, 2009 Red Hat, Inc. |
| Written by Alexander Larsson <alexl@redhat.com>, 2002 |
| Based on code by Jakub Jelinek <jakub@redhat.com>, 2001. |
| |
| @@ -114,6 +114,7 @@ |
| static void (*write_32) (unsigned char *ptr, GElf_Addr val); |
| |
| static int ptr_size; |
| +static int cu_version; |
| |
| static inline rpmuint16_t |
| buf_read_ule16 (unsigned char *data) |
| @@ -239,16 +240,18 @@ |
| #define DEBUG_LINE 2 |
| #define DEBUG_ARANGES 3 |
| #define DEBUG_PUBNAMES 4 |
| -#define DEBUG_MACINFO 5 |
| -#define DEBUG_LOC 6 |
| -#define DEBUG_STR 7 |
| -#define DEBUG_FRAME 8 |
| -#define DEBUG_RANGES 9 |
| +#define DEBUG_PUBTYPES 5 |
| +#define DEBUG_MACINFO 6 |
| +#define DEBUG_LOC 7 |
| +#define DEBUG_STR 8 |
| +#define DEBUG_FRAME 9 |
| +#define DEBUG_RANGES 10 |
| { ".debug_info", NULL, NULL, 0, 0, 0 }, |
| { ".debug_abbrev", NULL, NULL, 0, 0, 0 }, |
| { ".debug_line", NULL, NULL, 0, 0, 0 }, |
| { ".debug_aranges", NULL, NULL, 0, 0, 0 }, |
| { ".debug_pubnames", NULL, NULL, 0, 0, 0 }, |
| + { ".debug_pubtypes", NULL, NULL, 0, 0, 0 }, |
| { ".debug_macinfo", NULL, NULL, 0, 0, 0 }, |
| { ".debug_loc", NULL, NULL, 0, 0, 0 }, |
| { ".debug_str", NULL, NULL, 0, 0, 0 }, |
| @@ -328,7 +331,7 @@ |
| } |
| if (*slot != NULL) |
| { |
| - error (0, 0, "%s: Duplicate DWARF-2 abbreviation %d", dso->filename, |
| + error (0, 0, "%s: Duplicate DWARF abbreviation %d", dso->filename, |
| t->entry); |
| free (t); |
| htab_delete (h); |
| @@ -348,7 +351,7 @@ |
| form = read_uleb128 (ptr); |
| if (form == 2 || form > DW_FORM_indirect) |
| { |
| - error (0, 0, "%s: Unknown DWARF-2 DW_FORM_%d", dso->filename, form); |
| + error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename, form); |
| htab_delete (h); |
| return NULL; |
| } |
| @@ -358,7 +361,7 @@ |
| } |
| if (read_uleb128 (ptr) != 0) |
| { |
| - error (0, 0, "%s: DWARF-2 abbreviation does not end with 2 zeros", |
| + error (0, 0, "%s: DWARF abbreviation does not end with 2 zeros", |
| dso->filename); |
| htab_delete (h); |
| return NULL; |
| @@ -510,7 +513,7 @@ |
| } |
| |
| value = read_16 (ptr); |
| - if (value != 2) |
| + if (value != 2 && value != 3) |
| { |
| error (0, 0, "%s: DWARF version %d unhandled", dso->filename, |
| value); |
| @@ -855,7 +858,12 @@ |
| |
| switch (form) |
| { |
| - case DW_FORM_ref_addr: /* ptr_size in DWARF 2, offset in DWARF 3 */ |
| + case DW_FORM_ref_addr: |
| + if (cu_version == 2) |
| + ptr += ptr_size; |
| + else |
| + ptr += 4; |
| + break; |
| case DW_FORM_addr: |
| ptr += ptr_size; |
| break; |
| @@ -907,7 +915,7 @@ |
| assert (len < UINT_MAX); |
| break; |
| default: |
| - error (0, 0, "%s: Unknown DWARF-2 DW_FORM_%d", dso->filename, |
| + error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename, |
| form); |
| return NULL; |
| } |
| @@ -1204,11 +1212,11 @@ |
| return 1; |
| } |
| |
| - value = read_16 (ptr); |
| - if (value != 2) |
| + cu_version = read_16 (ptr); |
| + if (cu_version != 2 && cu_version != 3) |
| { |
| error (0, 0, "%s: DWARF version %d unhandled", dso->filename, |
| - value); |
| + cu_version); |
| return 1; |
| } |
| |
| @@ -1218,7 +1226,7 @@ |
| if (debug_sections[DEBUG_ABBREV].data == NULL) |
| error (0, 0, "%s: .debug_abbrev not present", dso->filename); |
| else |
| - error (0, 0, "%s: DWARF-2 CU abbrev offset too large", |
| + error (0, 0, "%s: DWARF CU abbrev offset too large", |
| dso->filename); |
| return 1; |
| } |
| @@ -1228,14 +1236,14 @@ |
| ptr_size = read_1 (ptr); |
| if (ptr_size != 4 && ptr_size != 8) |
| { |
| - error (0, 0, "%s: Invalid DWARF-2 pointer size %d", |
| + error (0, 0, "%s: Invalid DWARF pointer size %d", |
| dso->filename, ptr_size); |
| return 1; |
| } |
| } |
| else if (read_1 (ptr) != ptr_size) |
| { |
| - error (0, 0, "%s: DWARF-2 pointer size differs between CUs", |
| + error (0, 0, "%s: DWARF pointer size differs between CUs", |
| dso->filename); |
| return 1; |
| } |
| @@ -1253,7 +1261,7 @@ |
| t = htab_find_with_hash (abbrev, &tag, tag.entry); |
| if (t == NULL) |
| { |
| - error (0, 0, "%s: Could not find DWARF-2 abbreviation %d", |
| + error (0, 0, "%s: Could not find DWARF abbreviation %d", |
| dso->filename, tag.entry); |
| htab_delete (abbrev); |
| return 1; |