]> git.pld-linux.org Git - packages/rpm.git/blame - rpm-rpm5-debugedit.patch
- update tools/debugedit.c r2.22 from rpm5 trunk (raw)
[packages/rpm.git] / rpm-rpm5-debugedit.patch
CommitLineData
f8aa6628
ER
1--- rpm-4.5/tools/debugedit.c 2008-04-06 23:32:15.000000000 +0300
2+++ trunk/tools/debugedit.c 2010-01-27 18:57:49.758813670 +0200
62238cf9 3@@ -1,4 +1,4 @@
f8aa6628
ER
4-/* Copyright (C) 2001, 2002, 2003, 2005, 2007 Red Hat, Inc.
5+/* Copyright (C) 2001, 2002, 2003, 2005, 2007, 2009 Red Hat, Inc.
62238cf9 6 Written by Alexander Larsson <alexl@redhat.com>, 2002
7 Based on code by Jakub Jelinek <jakub@redhat.com>, 2001.
8
9@@ -66,8 +66,8 @@
10 #define DW_FORM_indirect 0x16
11
12 #include <beecrypt/beecrypt.h>
f8aa6628 13-
62238cf9 14 #include "hashtab.h"
f8aa6628 15+#include <rpmtag.h>
62238cf9 16
17 #define DW_TAG_partial_unit 0x3c
18
f8aa6628 19@@ -77,9 +77,6 @@
62238cf9 20 int list_file_fd = -1;
21 int do_build_id = 0;
22
f8aa6628
ER
23-typedef unsigned int uint_32;
24-typedef unsigned short uint_16;
25-
62238cf9 26 typedef struct
27 {
28 Elf *elf;
f8aa6628 29@@ -93,7 +90,7 @@
62238cf9 30 typedef struct
31 {
32 unsigned char *ptr;
f8aa6628
ER
33- uint_32 addend;
34+ rpmuint32_t addend;
62238cf9 35 } REL;
36
37 #define read_uleb128(ptr) ({ \
f8aa6628 38@@ -112,31 +109,32 @@
62238cf9 39 ret; \
40 })
41
f8aa6628
ER
42-static uint_16 (*do_read_16) (unsigned char *ptr);
43-static uint_32 (*do_read_32) (unsigned char *ptr);
44+static rpmuint16_t (*do_read_16) (unsigned char *ptr);
45+static rpmuint32_t (*do_read_32) (unsigned char *ptr);
62238cf9 46 static void (*write_32) (unsigned char *ptr, GElf_Addr val);
47
48 static int ptr_size;
f8aa6628 49+static int cu_version;
62238cf9 50
f8aa6628
ER
51-static inline uint_16
52+static inline rpmuint16_t
62238cf9 53 buf_read_ule16 (unsigned char *data)
54 {
55 return data[0] | (data[1] << 8);
56 }
57
f8aa6628
ER
58-static inline uint_16
59+static inline rpmuint16_t
62238cf9 60 buf_read_ube16 (unsigned char *data)
61 {
62 return data[1] | (data[0] << 8);
63 }
64
f8aa6628
ER
65-static inline uint_32
66+static inline rpmuint32_t
62238cf9 67 buf_read_ule32 (unsigned char *data)
68 {
69 return data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
70 }
71
f8aa6628
ER
72-static inline uint_32
73+static inline rpmuint32_t
62238cf9 74 buf_read_ube32 (unsigned char *data)
75 {
76 return data[3] | (data[2] << 8) | (data[1] << 16) | (data[0] << 24);
f8aa6628 77@@ -156,7 +154,7 @@
62238cf9 78 {
79 if (data->d_buf
80 && offset >= data->d_off
f8aa6628
ER
81- && offset < data->d_off + data->d_size)
82+ && offset < data->d_off + (off_t)data->d_size)
62238cf9 83 return (const char *) data->d_buf + (offset - data->d_off);
84 }
85 }
f8aa6628 86@@ -168,13 +166,13 @@
62238cf9 87 #define read_1(ptr) *ptr++
88
89 #define read_16(ptr) ({ \
f8aa6628
ER
90- uint_16 ret = do_read_16 (ptr); \
91+ rpmuint16_t ret = do_read_16 (ptr); \
62238cf9 92 ptr += 2; \
93 ret; \
94 })
95
96 #define read_32(ptr) ({ \
f8aa6628
ER
97- uint_32 ret = do_read_32 (ptr); \
98+ rpmuint32_t ret = do_read_32 (ptr); \
62238cf9 99 ptr += 4; \
100 ret; \
101 })
f8aa6628 102@@ -183,7 +181,7 @@
62238cf9 103 int reltype;
104
105 #define do_read_32_relocated(ptr) ({ \
f8aa6628
ER
106- uint_32 dret = do_read_32 (ptr); \
107+ rpmuint32_t dret = do_read_32 (ptr); \
62238cf9 108 if (relptr) \
109 { \
110 while (relptr < relend && relptr->ptr < ptr) \
f8aa6628 111@@ -200,7 +198,7 @@
62238cf9 112 })
113
114 #define read_32_relocated(ptr) ({ \
f8aa6628
ER
115- uint_32 ret = do_read_32_relocated (ptr); \
116+ rpmuint32_t ret = do_read_32_relocated (ptr); \
62238cf9 117 ptr += 4; \
118 ret; \
119 })
f8aa6628 120@@ -208,7 +206,7 @@
62238cf9 121 static void
122 dwarf2_write_le32 (unsigned char *p, GElf_Addr val)
123 {
f8aa6628
ER
124- uint_32 v = (uint_32) val;
125+ rpmuint32_t v = (rpmuint32_t) val;
62238cf9 126
127 p[0] = v;
128 p[1] = v >> 8;
f8aa6628 129@@ -220,7 +218,7 @@
62238cf9 130 static void
131 dwarf2_write_be32 (unsigned char *p, GElf_Addr val)
132 {
f8aa6628
ER
133- uint_32 v = (uint_32) val;
134+ rpmuint32_t v = (rpmuint32_t) val;
62238cf9 135
136 p[3] = v;
137 p[2] = v >> 8;
f8aa6628 138@@ -242,16 +240,18 @@
62238cf9 139 #define DEBUG_LINE 2
140 #define DEBUG_ARANGES 3
141 #define DEBUG_PUBNAMES 4
f8aa6628
ER
142-#define DEBUG_MACINFO 5
143-#define DEBUG_LOC 6
144-#define DEBUG_STR 7
145-#define DEBUG_FRAME 8
146-#define DEBUG_RANGES 9
147+#define DEBUG_PUBTYPES 5
148+#define DEBUG_MACINFO 6
149+#define DEBUG_LOC 7
150+#define DEBUG_STR 8
151+#define DEBUG_FRAME 9
152+#define DEBUG_RANGES 10
62238cf9 153 { ".debug_info", NULL, NULL, 0, 0, 0 },
154 { ".debug_abbrev", NULL, NULL, 0, 0, 0 },
155 { ".debug_line", NULL, NULL, 0, 0, 0 },
156 { ".debug_aranges", NULL, NULL, 0, 0, 0 },
157 { ".debug_pubnames", NULL, NULL, 0, 0, 0 },
f8aa6628 158+ { ".debug_pubtypes", NULL, NULL, 0, 0, 0 },
62238cf9 159 { ".debug_macinfo", NULL, NULL, 0, 0, 0 },
160 { ".debug_loc", NULL, NULL, 0, 0, 0 },
161 { ".debug_str", NULL, NULL, 0, 0, 0 },
162@@ -331,7 +331,7 @@
163 }
164 if (*slot != NULL)
165 {
f8aa6628
ER
166- error (0, 0, "%s: Duplicate DWARF-2 abbreviation %d", dso->filename,
167+ error (0, 0, "%s: Duplicate DWARF abbreviation %d", dso->filename,
62238cf9 168 t->entry);
169 free (t);
170 htab_delete (h);
171@@ -351,7 +351,7 @@
172 form = read_uleb128 (ptr);
173 if (form == 2 || form > DW_FORM_indirect)
174 {
f8aa6628
ER
175- error (0, 0, "%s: Unknown DWARF-2 DW_FORM_%d", dso->filename, form);
176+ error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename, form);
62238cf9 177 htab_delete (h);
178 return NULL;
179 }
180@@ -361,7 +361,7 @@
181 }
182 if (read_uleb128 (ptr) != 0)
183 {
f8aa6628
ER
184- error (0, 0, "%s: DWARF-2 abbreviation does not end with 2 zeros",
185+ error (0, 0, "%s: DWARF abbreviation does not end with 2 zeros",
62238cf9 186 dso->filename);
187 htab_delete (h);
188 return NULL;
189@@ -468,8 +468,8 @@
190 has_prefix (const char *str,
191 const char *prefix)
192 {
f8aa6628
ER
193- int str_len;
194- int prefix_len;
195+ size_t str_len;
196+ size_t prefix_len;
62238cf9 197
198 str_len = strlen (str);
199 prefix_len = strlen (prefix);
200@@ -481,14 +481,14 @@
201 }
202
203 static int
f8aa6628
ER
204-edit_dwarf2_line (DSO *dso, uint_32 off, char *comp_dir, int phase)
205+edit_dwarf2_line (DSO *dso, rpmuint32_t off, char *comp_dir, int phase)
62238cf9 206 {
207 unsigned char *ptr = debug_sections[DEBUG_LINE].data, *dir;
208 unsigned char **dirt;
209 unsigned char *endsec = ptr + debug_sections[DEBUG_LINE].size;
210 unsigned char *endcu, *endprol;
211 unsigned char opcode_base;
f8aa6628
ER
212- uint_32 value, dirt_cnt;
213+ rpmuint32_t value, dirt_cnt;
62238cf9 214 size_t comp_dir_len = strlen (comp_dir);
215 size_t abs_file_cnt = 0, abs_dir_cnt = 0;
216
217@@ -513,7 +513,7 @@
218 }
219
220 value = read_16 (ptr);
f8aa6628
ER
221- if (value != 2)
222+ if (value != 2 && value != 3)
62238cf9 223 {
224 error (0, 0, "%s: DWARF version %d unhandled", dso->filename,
225 value);
f8aa6628 226@@ -679,9 +679,12 @@
62238cf9 227 if (--shrank == 0)
228 error (EXIT_FAILURE, 0,
229 "canonicalization unexpectedly shrank by one character");
f8aa6628
ER
230- memset (ptr, 'X', shrank);
231- ptr += shrank;
232- *ptr++ = '\0';
233+ else
234+ {
235+ memset (ptr, 'X', shrank);
236+ ptr += shrank;
237+ *ptr++ = '\0';
238+ }
62238cf9 239 }
240
241 if (abs_dir_cnt + abs_file_cnt != 0)
f8aa6628 242@@ -737,7 +740,7 @@
62238cf9 243 edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
244 {
245 int i;
f8aa6628
ER
246- uint_32 list_offs;
247+ rpmuint32_t list_offs;
62238cf9 248 int found_list_offs;
249 char *comp_dir;
250
f8aa6628 251@@ -746,9 +749,9 @@
62238cf9 252 found_list_offs = 0;
253 for (i = 0; i < t->nattr; ++i)
254 {
f8aa6628
ER
255- uint_32 form = t->attr[i].form;
256- uint_32 len = 0;
257- int base_len, dest_len;
258+ rpmuint32_t form = t->attr[i].form;
259+ size_t len = 0;
260+ size_t base_len, dest_len;
62238cf9 261
262
263 while (1)
f8aa6628 264@@ -791,7 +794,7 @@
62238cf9 265 {
266 char *dir;
267
f8aa6628
ER
268- dir = (char *)debug_sections[DEBUG_STR].data
269+ dir = (char *) debug_sections[DEBUG_STR].data
62238cf9 270 + do_read_32_relocated (ptr);
271
272 free (comp_dir);
f8aa6628 273@@ -821,7 +824,7 @@
62238cf9 274 {
275 char *name;
276
f8aa6628
ER
277- name = (char *)debug_sections[DEBUG_STR].data
278+ name = (char *) debug_sections[DEBUG_STR].data
62238cf9 279 + do_read_32_relocated (ptr);
280 if (*name == '/' && comp_dir == NULL)
281 {
f8aa6628 282@@ -855,7 +858,12 @@
62238cf9 283
284 switch (form)
285 {
f8aa6628
ER
286- case DW_FORM_ref_addr: /* ptr_size in DWARF 2, offset in DWARF 3 */
287+ case DW_FORM_ref_addr:
288+ if (cu_version == 2)
289+ ptr += ptr_size;
290+ else
291+ ptr += 4;
292+ break;
62238cf9 293 case DW_FORM_addr:
294 ptr += ptr_size;
295 break;
f8aa6628 296@@ -907,7 +915,7 @@
62238cf9 297 assert (len < UINT_MAX);
298 break;
299 default:
f8aa6628
ER
300- error (0, 0, "%s: Unknown DWARF-2 DW_FORM_%d", dso->filename,
301+ error (0, 0, "%s: Unknown DWARF DW_FORM_%d", dso->filename,
62238cf9 302 form);
303 return NULL;
304 }
f8aa6628 305@@ -918,6 +926,34 @@
62238cf9 306 break;
307 }
308 }
f8aa6628
ER
309+
310+ /* Ensure the CU current directory will exist even if only empty. Source
311+ filenames possibly located in its parent directories refer relatively to
312+ it and the debugger (GDB) cannot safely optimize out the missing
313+ CU current dir subdirectories. */
314+ if (comp_dir && list_file_fd != -1)
315+ {
316+ char *p;
317+ size_t size;
318+
319+ if (base_dir && has_prefix (comp_dir, base_dir))
320+ p = comp_dir + strlen (base_dir);
321+ else if (dest_dir && has_prefix (comp_dir, dest_dir))
322+ p = comp_dir + strlen (dest_dir);
323+ else
324+ p = comp_dir;
325+
326+ size = strlen (p) + 1;
327+ while (size > 0)
328+ {
329+ ssize_t ret = write (list_file_fd, p, size);
330+ if (ret == -1)
331+ break;
332+ size -= ret;
333+ p += ret;
334+ }
335+ }
336+
62238cf9 337 if (found_list_offs && comp_dir)
338 edit_dwarf2_line (dso, list_offs, comp_dir, phase);
339
f8aa6628 340@@ -1034,7 +1070,7 @@
62238cf9 341 if (debug_sections[DEBUG_INFO].data != NULL)
342 {
343 unsigned char *ptr, *endcu, *endsec;
f8aa6628
ER
344- uint_32 value;
345+ rpmuint32_t value;
62238cf9 346 htab_t abbrev;
347 struct abbrev_tag tag, *t;
348 int phase;
f8aa6628 349@@ -1176,11 +1212,11 @@
62238cf9 350 return 1;
351 }
352
f8aa6628
ER
353- value = read_16 (ptr);
354- if (value != 2)
355+ cu_version = read_16 (ptr);
356+ if (cu_version != 2 && cu_version != 3)
62238cf9 357 {
358 error (0, 0, "%s: DWARF version %d unhandled", dso->filename,
f8aa6628
ER
359- value);
360+ cu_version);
62238cf9 361 return 1;
362 }
363
f8aa6628 364@@ -1190,7 +1226,7 @@
62238cf9 365 if (debug_sections[DEBUG_ABBREV].data == NULL)
366 error (0, 0, "%s: .debug_abbrev not present", dso->filename);
367 else
f8aa6628
ER
368- error (0, 0, "%s: DWARF-2 CU abbrev offset too large",
369+ error (0, 0, "%s: DWARF CU abbrev offset too large",
62238cf9 370 dso->filename);
371 return 1;
372 }
f8aa6628 373@@ -1200,14 +1236,14 @@
62238cf9 374 ptr_size = read_1 (ptr);
375 if (ptr_size != 4 && ptr_size != 8)
376 {
f8aa6628
ER
377- error (0, 0, "%s: Invalid DWARF-2 pointer size %d",
378+ error (0, 0, "%s: Invalid DWARF pointer size %d",
62238cf9 379 dso->filename, ptr_size);
380 return 1;
381 }
382 }
383 else if (read_1 (ptr) != ptr_size)
384 {
f8aa6628
ER
385- error (0, 0, "%s: DWARF-2 pointer size differs between CUs",
386+ error (0, 0, "%s: DWARF pointer size differs between CUs",
62238cf9 387 dso->filename);
388 return 1;
389 }
f8aa6628 390@@ -1225,7 +1261,7 @@
62238cf9 391 t = htab_find_with_hash (abbrev, &tag, tag.entry);
392 if (t == NULL)
393 {
f8aa6628
ER
394- error (0, 0, "%s: Could not find DWARF-2 abbreviation %d",
395+ error (0, 0, "%s: Could not find DWARF abbreviation %d",
62238cf9 396 dso->filename, tag.entry);
397 htab_delete (abbrev);
398 return 1;
f8aa6628 399@@ -1374,12 +1410,12 @@
62238cf9 400 or Elf64 object, only that we are consistent in what bits feed the
401 hash so it comes out the same for the same file contents. */
402 {
f8aa6628
ER
403- inline void process (const void *data, size_t size)
404+ auto inline void process (const void *data, size_t size);
405+ auto inline void process (const void *data, size_t size)
62238cf9 406 {
407 memchunk chunk = { .data = (void *) data, .size = size };
408 hashFunctionContextUpdateMC (&ctx, &chunk);
409 }
f8aa6628 410-
62238cf9 411 union
412 {
413 GElf_Ehdr ehdr;
f8aa6628 414@@ -1439,11 +1475,11 @@
62238cf9 415
416 /* Now format the build ID bits in hex to print out. */
417 {
f8aa6628
ER
418- const unsigned char * id = (unsigned char *) build_id->d_buf + build_id_offset;
419+ const rpmuint8_t * id = (rpmuint8_t *)build_id->d_buf + build_id_offset;
62238cf9 420 char hex[build_id_size * 2 + 1];
421 int n = snprintf (hex, 3, "%02" PRIx8, id[0]);
422 assert (n == 2);
f8aa6628
ER
423- for (i = 1; i < build_id_size; ++i)
424+ for (i = 1; i < (int)build_id_size; ++i)
62238cf9 425 {
426 n = snprintf (&hex[i * 2], 3, "%02" PRIx8, id[i]);
427 assert (n == 2);
f8aa6628 428@@ -1466,8 +1502,7 @@
62238cf9 429 Elf_Data *build_id = NULL;
430 size_t build_id_offset = 0, build_id_size = 0;
431
f8aa6628
ER
432- optCon = poptGetContext("debugedit", argc, (const char **)argv,
433- optionsTable, 0);
434+ optCon = poptGetContext("debugedit", argc, (const char **)argv, optionsTable, 0);
62238cf9 435
436 while ((nextopt = poptGetNextOpt (optCon)) > 0 || nextopt == POPT_ERROR_BADOPT)
437 /* do nothing */ ;
f8aa6628 438@@ -1585,7 +1620,8 @@
62238cf9 439 Elf_Data src = dst;
440 src.d_buf = data->d_buf;
441 assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
f8aa6628
ER
442- while ((char *) data->d_buf + data->d_size - (char *) src.d_buf > (int) sizeof nh
443+ while ((char *) data->d_buf + data->d_size -
444+ (char *) src.d_buf > (int) sizeof nh
62238cf9 445 && elf32_xlatetom (&dst, &src, dso->ehdr.e_ident[EI_DATA]))
446 {
447 Elf32_Word len = sizeof nh + nh.n_namesz;
f8aa6628 448@@ -1595,7 +1631,8 @@
62238cf9 449 && !memcmp ((char *) src.d_buf + sizeof nh, "GNU", sizeof "GNU"))
450 {
451 build_id = data;
f8aa6628
ER
452- build_id_offset = (char *) src.d_buf + len - (char *) data->d_buf;
453+ build_id_offset = (char *) src.d_buf + len -
454+ (char *) data->d_buf;
62238cf9 455 build_id_size = nh.n_descsz;
456 break;
457 }
This page took 0.099091 seconds and 4 git commands to generate.