[ARC] Object attributes.
[deliverable/binutils-gdb.git] / binutils / elfcomm.c
1 /* elfcomm.c -- common code for ELF format file.
2 Copyright (C) 2010-2017 Free Software Foundation, Inc.
3
4 Originally developed by Eric Youngdale <eric@andante.jic.com>
5 Modifications by Nick Clifton <nickc@redhat.com>
6
7 This file is part of GNU Binutils.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23
24 #include "sysdep.h"
25 #include "libiberty.h"
26 #include "filenames.h"
27 #include "bfd.h"
28 #include "aout/ar.h"
29 #include "bucomm.h"
30 #include "elfcomm.h"
31 #include <assert.h>
32
33 void
34 error (const char *message, ...)
35 {
36 va_list args;
37
38 /* Try to keep error messages in sync with the program's normal output. */
39 fflush (stdout);
40
41 va_start (args, message);
42 fprintf (stderr, _("%s: Error: "), program_name);
43 vfprintf (stderr, message, args);
44 va_end (args);
45 }
46
47 void
48 warn (const char *message, ...)
49 {
50 va_list args;
51
52 /* Try to keep warning messages in sync with the program's normal output. */
53 fflush (stdout);
54
55 va_start (args, message);
56 fprintf (stderr, _("%s: Warning: "), program_name);
57 vfprintf (stderr, message, args);
58 va_end (args);
59 }
60
61 void (*byte_put) (unsigned char *, elf_vma, int);
62
63 void
64 byte_put_little_endian (unsigned char * field, elf_vma value, int size)
65 {
66 switch (size)
67 {
68 case 8:
69 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
70 field[6] = ((value >> 24) >> 24) & 0xff;
71 field[5] = ((value >> 24) >> 16) & 0xff;
72 field[4] = ((value >> 24) >> 8) & 0xff;
73 /* Fall through. */
74 case 4:
75 field[3] = (value >> 24) & 0xff;
76 /* Fall through. */
77 case 3:
78 field[2] = (value >> 16) & 0xff;
79 /* Fall through. */
80 case 2:
81 field[1] = (value >> 8) & 0xff;
82 /* Fall through. */
83 case 1:
84 field[0] = value & 0xff;
85 break;
86
87 default:
88 error (_("Unhandled data length: %d\n"), size);
89 abort ();
90 }
91 }
92
93 void
94 byte_put_big_endian (unsigned char * field, elf_vma value, int size)
95 {
96 switch (size)
97 {
98 case 8:
99 field[7] = value & 0xff;
100 field[6] = (value >> 8) & 0xff;
101 field[5] = (value >> 16) & 0xff;
102 field[4] = (value >> 24) & 0xff;
103 value >>= 16;
104 value >>= 16;
105 /* Fall through. */
106 case 4:
107 field[3] = value & 0xff;
108 value >>= 8;
109 /* Fall through. */
110 case 3:
111 field[2] = value & 0xff;
112 value >>= 8;
113 /* Fall through. */
114 case 2:
115 field[1] = value & 0xff;
116 value >>= 8;
117 /* Fall through. */
118 case 1:
119 field[0] = value & 0xff;
120 break;
121
122 default:
123 error (_("Unhandled data length: %d\n"), size);
124 abort ();
125 }
126 }
127
128 elf_vma (*byte_get) (unsigned char *, int);
129
130 elf_vma
131 byte_get_little_endian (unsigned char *field, int size)
132 {
133 switch (size)
134 {
135 case 1:
136 return *field;
137
138 case 2:
139 return ((unsigned int) (field[0]))
140 | (((unsigned int) (field[1])) << 8);
141
142 case 3:
143 return ((unsigned long) (field[0]))
144 | (((unsigned long) (field[1])) << 8)
145 | (((unsigned long) (field[2])) << 16);
146
147 case 4:
148 return ((unsigned long) (field[0]))
149 | (((unsigned long) (field[1])) << 8)
150 | (((unsigned long) (field[2])) << 16)
151 | (((unsigned long) (field[3])) << 24);
152
153 case 5:
154 if (sizeof (elf_vma) == 8)
155 return ((elf_vma) (field[0]))
156 | (((elf_vma) (field[1])) << 8)
157 | (((elf_vma) (field[2])) << 16)
158 | (((elf_vma) (field[3])) << 24)
159 | (((elf_vma) (field[4])) << 32);
160 else if (sizeof (elf_vma) == 4)
161 /* We want to extract data from an 8 byte wide field and
162 place it into a 4 byte wide field. Since this is a little
163 endian source we can just use the 4 byte extraction code. */
164 return ((unsigned long) (field[0]))
165 | (((unsigned long) (field[1])) << 8)
166 | (((unsigned long) (field[2])) << 16)
167 | (((unsigned long) (field[3])) << 24);
168 /* Fall through. */
169
170 case 6:
171 if (sizeof (elf_vma) == 8)
172 return ((elf_vma) (field[0]))
173 | (((elf_vma) (field[1])) << 8)
174 | (((elf_vma) (field[2])) << 16)
175 | (((elf_vma) (field[3])) << 24)
176 | (((elf_vma) (field[4])) << 32)
177 | (((elf_vma) (field[5])) << 40);
178 else if (sizeof (elf_vma) == 4)
179 /* We want to extract data from an 8 byte wide field and
180 place it into a 4 byte wide field. Since this is a little
181 endian source we can just use the 4 byte extraction code. */
182 return ((unsigned long) (field[0]))
183 | (((unsigned long) (field[1])) << 8)
184 | (((unsigned long) (field[2])) << 16)
185 | (((unsigned long) (field[3])) << 24);
186 /* Fall through. */
187
188 case 7:
189 if (sizeof (elf_vma) == 8)
190 return ((elf_vma) (field[0]))
191 | (((elf_vma) (field[1])) << 8)
192 | (((elf_vma) (field[2])) << 16)
193 | (((elf_vma) (field[3])) << 24)
194 | (((elf_vma) (field[4])) << 32)
195 | (((elf_vma) (field[5])) << 40)
196 | (((elf_vma) (field[6])) << 48);
197 else if (sizeof (elf_vma) == 4)
198 /* We want to extract data from an 8 byte wide field and
199 place it into a 4 byte wide field. Since this is a little
200 endian source we can just use the 4 byte extraction code. */
201 return ((unsigned long) (field[0]))
202 | (((unsigned long) (field[1])) << 8)
203 | (((unsigned long) (field[2])) << 16)
204 | (((unsigned long) (field[3])) << 24);
205 /* Fall through. */
206
207 case 8:
208 if (sizeof (elf_vma) == 8)
209 return ((elf_vma) (field[0]))
210 | (((elf_vma) (field[1])) << 8)
211 | (((elf_vma) (field[2])) << 16)
212 | (((elf_vma) (field[3])) << 24)
213 | (((elf_vma) (field[4])) << 32)
214 | (((elf_vma) (field[5])) << 40)
215 | (((elf_vma) (field[6])) << 48)
216 | (((elf_vma) (field[7])) << 56);
217 else if (sizeof (elf_vma) == 4)
218 /* We want to extract data from an 8 byte wide field and
219 place it into a 4 byte wide field. Since this is a little
220 endian source we can just use the 4 byte extraction code. */
221 return ((unsigned long) (field[0]))
222 | (((unsigned long) (field[1])) << 8)
223 | (((unsigned long) (field[2])) << 16)
224 | (((unsigned long) (field[3])) << 24);
225 /* Fall through. */
226
227 default:
228 error (_("Unhandled data length: %d\n"), size);
229 abort ();
230 }
231 }
232
233 elf_vma
234 byte_get_big_endian (unsigned char *field, int size)
235 {
236 switch (size)
237 {
238 case 1:
239 return *field;
240
241 case 2:
242 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
243
244 case 3:
245 return ((unsigned long) (field[2]))
246 | (((unsigned long) (field[1])) << 8)
247 | (((unsigned long) (field[0])) << 16);
248
249 case 4:
250 return ((unsigned long) (field[3]))
251 | (((unsigned long) (field[2])) << 8)
252 | (((unsigned long) (field[1])) << 16)
253 | (((unsigned long) (field[0])) << 24);
254
255 case 5:
256 if (sizeof (elf_vma) == 8)
257 return ((elf_vma) (field[4]))
258 | (((elf_vma) (field[3])) << 8)
259 | (((elf_vma) (field[2])) << 16)
260 | (((elf_vma) (field[1])) << 24)
261 | (((elf_vma) (field[0])) << 32);
262 else if (sizeof (elf_vma) == 4)
263 {
264 /* Although we are extracting data from an 8 byte wide field,
265 we are returning only 4 bytes of data. */
266 field += 1;
267 return ((unsigned long) (field[3]))
268 | (((unsigned long) (field[2])) << 8)
269 | (((unsigned long) (field[1])) << 16)
270 | (((unsigned long) (field[0])) << 24);
271 }
272 /* Fall through. */
273
274 case 6:
275 if (sizeof (elf_vma) == 8)
276 return ((elf_vma) (field[5]))
277 | (((elf_vma) (field[4])) << 8)
278 | (((elf_vma) (field[3])) << 16)
279 | (((elf_vma) (field[2])) << 24)
280 | (((elf_vma) (field[1])) << 32)
281 | (((elf_vma) (field[0])) << 40);
282 else if (sizeof (elf_vma) == 4)
283 {
284 /* Although we are extracting data from an 8 byte wide field,
285 we are returning only 4 bytes of data. */
286 field += 2;
287 return ((unsigned long) (field[3]))
288 | (((unsigned long) (field[2])) << 8)
289 | (((unsigned long) (field[1])) << 16)
290 | (((unsigned long) (field[0])) << 24);
291 }
292 /* Fall through. */
293
294 case 7:
295 if (sizeof (elf_vma) == 8)
296 return ((elf_vma) (field[6]))
297 | (((elf_vma) (field[5])) << 8)
298 | (((elf_vma) (field[4])) << 16)
299 | (((elf_vma) (field[3])) << 24)
300 | (((elf_vma) (field[2])) << 32)
301 | (((elf_vma) (field[1])) << 40)
302 | (((elf_vma) (field[0])) << 48);
303 else if (sizeof (elf_vma) == 4)
304 {
305 /* Although we are extracting data from an 8 byte wide field,
306 we are returning only 4 bytes of data. */
307 field += 3;
308 return ((unsigned long) (field[3]))
309 | (((unsigned long) (field[2])) << 8)
310 | (((unsigned long) (field[1])) << 16)
311 | (((unsigned long) (field[0])) << 24);
312 }
313 /* Fall through. */
314
315 case 8:
316 if (sizeof (elf_vma) == 8)
317 return ((elf_vma) (field[7]))
318 | (((elf_vma) (field[6])) << 8)
319 | (((elf_vma) (field[5])) << 16)
320 | (((elf_vma) (field[4])) << 24)
321 | (((elf_vma) (field[3])) << 32)
322 | (((elf_vma) (field[2])) << 40)
323 | (((elf_vma) (field[1])) << 48)
324 | (((elf_vma) (field[0])) << 56);
325 else if (sizeof (elf_vma) == 4)
326 {
327 /* Although we are extracting data from an 8 byte wide field,
328 we are returning only 4 bytes of data. */
329 field += 4;
330 return ((unsigned long) (field[3]))
331 | (((unsigned long) (field[2])) << 8)
332 | (((unsigned long) (field[1])) << 16)
333 | (((unsigned long) (field[0])) << 24);
334 }
335 /* Fall through. */
336
337 default:
338 error (_("Unhandled data length: %d\n"), size);
339 abort ();
340 }
341 }
342
343 elf_vma
344 byte_get_signed (unsigned char *field, int size)
345 {
346 elf_vma x = byte_get (field, size);
347
348 switch (size)
349 {
350 case 1:
351 return (x ^ 0x80) - 0x80;
352 case 2:
353 return (x ^ 0x8000) - 0x8000;
354 case 3:
355 return (x ^ 0x800000) - 0x800000;
356 case 4:
357 return (x ^ 0x80000000) - 0x80000000;
358 case 5:
359 case 6:
360 case 7:
361 case 8:
362 /* Reads of 5-, 6-, and 7-byte numbers are the result of
363 trying to read past the end of a buffer, and will therefore
364 not have meaningful values, so we don't try to deal with
365 the sign in these cases. */
366 return x;
367 default:
368 abort ();
369 }
370 }
371
372 /* Return the high-order 32-bits and the low-order 32-bits
373 of an 8-byte value separately. */
374
375 void
376 byte_get_64 (unsigned char *field, elf_vma *high, elf_vma *low)
377 {
378 if (byte_get == byte_get_big_endian)
379 {
380 *high = byte_get_big_endian (field, 4);
381 *low = byte_get_big_endian (field + 4, 4);
382 }
383 else
384 {
385 *high = byte_get_little_endian (field + 4, 4);
386 *low = byte_get_little_endian (field, 4);
387 }
388 return;
389 }
390
391 /* Return the path name for a proxy entry in a thin archive, adjusted
392 relative to the path name of the thin archive itself if necessary.
393 Always returns a pointer to malloc'ed memory. */
394
395 char *
396 adjust_relative_path (const char *file_name, const char *name,
397 unsigned long name_len)
398 {
399 char * member_file_name;
400 const char * base_name = lbasename (file_name);
401 size_t amt;
402
403 /* This is a proxy entry for a thin archive member.
404 If the extended name table contains an absolute path
405 name, or if the archive is in the current directory,
406 use the path name as given. Otherwise, we need to
407 find the member relative to the directory where the
408 archive is located. */
409 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
410 {
411 amt = name_len + 1;
412 if (amt == 0)
413 return NULL;
414 member_file_name = (char *) malloc (amt);
415 if (member_file_name == NULL)
416 {
417 error (_("Out of memory\n"));
418 return NULL;
419 }
420 memcpy (member_file_name, name, name_len);
421 member_file_name[name_len] = '\0';
422 }
423 else
424 {
425 /* Concatenate the path components of the archive file name
426 to the relative path name from the extended name table. */
427 size_t prefix_len = base_name - file_name;
428
429 amt = prefix_len + name_len + 1;
430 /* PR 17531: file: 2896dc8b
431 Catch wraparound. */
432 if (amt < prefix_len || amt < name_len)
433 {
434 error (_("Abnormal length of thin archive member name: %lx\n"),
435 name_len);
436 return NULL;
437 }
438
439 member_file_name = (char *) malloc (amt);
440 if (member_file_name == NULL)
441 {
442 error (_("Out of memory\n"));
443 return NULL;
444 }
445 memcpy (member_file_name, file_name, prefix_len);
446 memcpy (member_file_name + prefix_len, name, name_len);
447 member_file_name[prefix_len + name_len] = '\0';
448 }
449 return member_file_name;
450 }
451
452 /* Processes the archive index table and symbol table in ARCH.
453 Entries in the index table are SIZEOF_AR_INDEX bytes long.
454 Fills in ARCH->next_arhdr_offset and ARCH->arhdr.
455 If READ_SYMBOLS is true then fills in ARCH->index_num, ARCH->index_array,
456 ARCH->sym_size and ARCH->sym_table.
457 It is the caller's responsibility to free ARCH->index_array and
458 ARCH->sym_table.
459 Returns TRUE upon success, FALSE otherwise.
460 If failure occurs an error message is printed. */
461
462 static bfd_boolean
463 process_archive_index_and_symbols (struct archive_info * arch,
464 unsigned int sizeof_ar_index,
465 bfd_boolean read_symbols)
466 {
467 size_t got;
468 unsigned long size;
469
470 size = strtoul (arch->arhdr.ar_size, NULL, 10);
471 /* PR 17531: file: 912bd7de. */
472 if ((signed long) size < 0)
473 {
474 error (_("%s: invalid archive header size: %ld\n"),
475 arch->file_name, size);
476 return FALSE;
477 }
478
479 size = size + (size & 1);
480
481 arch->next_arhdr_offset += sizeof arch->arhdr + size;
482
483 if (! read_symbols)
484 {
485 if (fseek (arch->file, size, SEEK_CUR) != 0)
486 {
487 error (_("%s: failed to skip archive symbol table\n"),
488 arch->file_name);
489 return FALSE;
490 }
491 }
492 else
493 {
494 unsigned long i;
495 /* A buffer used to hold numbers read in from an archive index.
496 These are always SIZEOF_AR_INDEX bytes long and stored in
497 big-endian format. */
498 unsigned char integer_buffer[sizeof arch->index_num];
499 unsigned char * index_buffer;
500
501 assert (sizeof_ar_index <= sizeof integer_buffer);
502
503 /* Check the size of the archive index. */
504 if (size < sizeof_ar_index)
505 {
506 error (_("%s: the archive index is empty\n"), arch->file_name);
507 return FALSE;
508 }
509
510 /* Read the number of entries in the archive index. */
511 got = fread (integer_buffer, 1, sizeof_ar_index, arch->file);
512 if (got != sizeof_ar_index)
513 {
514 error (_("%s: failed to read archive index\n"), arch->file_name);
515 return FALSE;
516 }
517
518 arch->index_num = byte_get_big_endian (integer_buffer, sizeof_ar_index);
519 size -= sizeof_ar_index;
520
521 if (size < arch->index_num * sizeof_ar_index
522 /* PR 17531: file: 585515d1. */
523 || size < arch->index_num)
524 {
525 error (_("%s: the archive index is supposed to have 0x%lx entries of %d bytes, but the size is only 0x%lx\n"),
526 arch->file_name, (long) arch->index_num, sizeof_ar_index, size);
527 return FALSE;
528 }
529
530 /* Read in the archive index. */
531 index_buffer = (unsigned char *)
532 malloc (arch->index_num * sizeof_ar_index);
533 if (index_buffer == NULL)
534 {
535 error (_("Out of memory whilst trying to read archive symbol index\n"));
536 return FALSE;
537 }
538
539 got = fread (index_buffer, sizeof_ar_index, arch->index_num, arch->file);
540 if (got != arch->index_num)
541 {
542 free (index_buffer);
543 error (_("%s: failed to read archive index\n"), arch->file_name);
544 return FALSE;
545 }
546
547 size -= arch->index_num * sizeof_ar_index;
548
549 /* Convert the index numbers into the host's numeric format. */
550 arch->index_array = (elf_vma *)
551 malloc (arch->index_num * sizeof (* arch->index_array));
552 if (arch->index_array == NULL)
553 {
554 free (index_buffer);
555 error (_("Out of memory whilst trying to convert the archive symbol index\n"));
556 return FALSE;
557 }
558
559 for (i = 0; i < arch->index_num; i++)
560 arch->index_array[i] =
561 byte_get_big_endian ((unsigned char *) (index_buffer + (i * sizeof_ar_index)),
562 sizeof_ar_index);
563 free (index_buffer);
564
565 /* The remaining space in the header is taken up by the symbol table. */
566 if (size < 1)
567 {
568 error (_("%s: the archive has an index but no symbols\n"),
569 arch->file_name);
570 return FALSE;
571 }
572
573 arch->sym_table = (char *) malloc (size);
574 if (arch->sym_table == NULL)
575 {
576 error (_("Out of memory whilst trying to read archive index symbol table\n"));
577 return FALSE;
578 }
579
580 arch->sym_size = size;
581 got = fread (arch->sym_table, 1, size, arch->file);
582 if (got != size)
583 {
584 error (_("%s: failed to read archive index symbol table\n"),
585 arch->file_name);
586 return FALSE;
587 }
588 }
589
590 /* Read the next archive header. */
591 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
592 if (got != sizeof arch->arhdr && got != 0)
593 {
594 error (_("%s: failed to read archive header following archive index\n"),
595 arch->file_name);
596 return FALSE;
597 }
598
599 return TRUE;
600 }
601
602 /* Read the symbol table and long-name table from an archive. */
603
604 int
605 setup_archive (struct archive_info *arch, const char *file_name,
606 FILE *file, bfd_boolean is_thin_archive,
607 bfd_boolean read_symbols)
608 {
609 size_t got;
610
611 arch->file_name = strdup (file_name);
612 arch->file = file;
613 arch->index_num = 0;
614 arch->index_array = NULL;
615 arch->sym_table = NULL;
616 arch->sym_size = 0;
617 arch->longnames = NULL;
618 arch->longnames_size = 0;
619 arch->nested_member_origin = 0;
620 arch->is_thin_archive = is_thin_archive;
621 arch->uses_64bit_indicies = FALSE;
622 arch->next_arhdr_offset = SARMAG;
623
624 /* Read the first archive member header. */
625 if (fseek (file, SARMAG, SEEK_SET) != 0)
626 {
627 error (_("%s: failed to seek to first archive header\n"), file_name);
628 return 1;
629 }
630 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
631 if (got != sizeof arch->arhdr)
632 {
633 if (got == 0)
634 return 0;
635
636 error (_("%s: failed to read archive header\n"), file_name);
637 return 1;
638 }
639
640 /* See if this is the archive symbol table. */
641 if (const_strneq (arch->arhdr.ar_name, "/ "))
642 {
643 if (! process_archive_index_and_symbols (arch, 4, read_symbols))
644 return 1;
645 }
646 else if (const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
647 {
648 arch->uses_64bit_indicies = TRUE;
649 if (! process_archive_index_and_symbols (arch, 8, read_symbols))
650 return 1;
651 }
652 else if (read_symbols)
653 printf (_("%s has no archive index\n"), file_name);
654
655 if (const_strneq (arch->arhdr.ar_name, "// "))
656 {
657 /* This is the archive string table holding long member names. */
658 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
659 /* PR 17531: file: 01068045. */
660 if (arch->longnames_size < 8)
661 {
662 error (_("%s: long name table is too small, (size = %ld)\n"),
663 file_name, arch->longnames_size);
664 return 1;
665 }
666 /* PR 17531: file: 639d6a26. */
667 if ((signed long) arch->longnames_size < 0)
668 {
669 error (_("%s: long name table is too big, (size = 0x%lx)\n"),
670 file_name, arch->longnames_size);
671 return 1;
672 }
673
674 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
675
676 /* Plus one to allow for a string terminator. */
677 arch->longnames = (char *) malloc (arch->longnames_size + 1);
678 if (arch->longnames == NULL)
679 {
680 error (_("Out of memory reading long symbol names in archive\n"));
681 return 1;
682 }
683
684 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
685 {
686 free (arch->longnames);
687 arch->longnames = NULL;
688 error (_("%s: failed to read long symbol name string table\n"),
689 file_name);
690 return 1;
691 }
692
693 if ((arch->longnames_size & 1) != 0)
694 getc (file);
695
696 arch->longnames[arch->longnames_size] = 0;
697 }
698
699 return 0;
700 }
701
702 /* Open and setup a nested archive, if not already open. */
703
704 int
705 setup_nested_archive (struct archive_info *nested_arch,
706 const char *member_file_name)
707 {
708 FILE * member_file;
709
710 /* Have we already setup this archive? */
711 if (nested_arch->file_name != NULL
712 && streq (nested_arch->file_name, member_file_name))
713 return 0;
714
715 /* Close previous file and discard cached information. */
716 if (nested_arch->file != NULL)
717 fclose (nested_arch->file);
718 release_archive (nested_arch);
719
720 member_file = fopen (member_file_name, "rb");
721 if (member_file == NULL)
722 return 1;
723 return setup_archive (nested_arch, member_file_name, member_file,
724 FALSE, FALSE);
725 }
726
727 /* Release the memory used for the archive information. */
728
729 void
730 release_archive (struct archive_info * arch)
731 {
732 if (arch->file_name != NULL)
733 free (arch->file_name);
734 if (arch->index_array != NULL)
735 free (arch->index_array);
736 if (arch->sym_table != NULL)
737 free (arch->sym_table);
738 if (arch->longnames != NULL)
739 free (arch->longnames);
740 }
741
742 /* Get the name of an archive member from the current archive header.
743 For simple names, this will modify the ar_name field of the current
744 archive header. For long names, it will return a pointer to the
745 longnames table. For nested archives, it will open the nested archive
746 and get the name recursively. NESTED_ARCH is a single-entry cache so
747 we don't keep rereading the same information from a nested archive. */
748
749 char *
750 get_archive_member_name (struct archive_info *arch,
751 struct archive_info *nested_arch)
752 {
753 unsigned long j, k;
754
755 if (arch->arhdr.ar_name[0] == '/')
756 {
757 /* We have a long name. */
758 char *endp;
759 char *member_file_name;
760 char *member_name;
761
762 if (arch->longnames == NULL || arch->longnames_size == 0)
763 {
764 error (_("Archive member uses long names, but no longname table found\n"));
765 return NULL;
766 }
767
768 arch->nested_member_origin = 0;
769 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
770 if (arch->is_thin_archive && endp != NULL && * endp == ':')
771 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
772
773 if (j > arch->longnames_size)
774 {
775 error (_("Found long name index (%ld) beyond end of long name table\n"),j);
776 return NULL;
777 }
778 while ((j < arch->longnames_size)
779 && (arch->longnames[j] != '\n')
780 && (arch->longnames[j] != '\0'))
781 j++;
782 if (j > 0 && arch->longnames[j-1] == '/')
783 j--;
784 if (j > arch->longnames_size)
785 j = arch->longnames_size;
786 arch->longnames[j] = '\0';
787
788 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
789 return arch->longnames + k;
790
791 /* PR 17531: file: 2896dc8b. */
792 if (k >= j)
793 {
794 error (_("Invalid Thin archive member name\n"));
795 return NULL;
796 }
797
798 /* This is a proxy for a member of a nested archive.
799 Find the name of the member in that archive. */
800 member_file_name = adjust_relative_path (arch->file_name,
801 arch->longnames + k, j - k);
802 if (member_file_name != NULL
803 && setup_nested_archive (nested_arch, member_file_name) == 0)
804 {
805 member_name = get_archive_member_name_at (nested_arch,
806 arch->nested_member_origin,
807 NULL);
808 if (member_name != NULL)
809 {
810 free (member_file_name);
811 return member_name;
812 }
813 }
814 free (member_file_name);
815
816 /* Last resort: just return the name of the nested archive. */
817 return arch->longnames + k;
818 }
819
820 /* We have a normal (short) name. */
821 for (j = 0; j < sizeof (arch->arhdr.ar_name); j++)
822 if (arch->arhdr.ar_name[j] == '/')
823 {
824 arch->arhdr.ar_name[j] = '\0';
825 return arch->arhdr.ar_name;
826 }
827
828 /* The full ar_name field is used. Don't rely on ar_date starting
829 with a zero byte. */
830 {
831 char *name = xmalloc (sizeof (arch->arhdr.ar_name) + 1);
832 memcpy (name, arch->arhdr.ar_name, sizeof (arch->arhdr.ar_name));
833 name[sizeof (arch->arhdr.ar_name)] = '\0';
834 return name;
835 }
836 }
837
838 /* Get the name of an archive member at a given OFFSET within an archive
839 ARCH. */
840
841 char *
842 get_archive_member_name_at (struct archive_info *arch,
843 unsigned long offset,
844 struct archive_info *nested_arch)
845 {
846 size_t got;
847
848 if (fseek (arch->file, offset, SEEK_SET) != 0)
849 {
850 error (_("%s: failed to seek to next file name\n"), arch->file_name);
851 return NULL;
852 }
853 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
854 if (got != sizeof arch->arhdr)
855 {
856 error (_("%s: failed to read archive header\n"), arch->file_name);
857 return NULL;
858 }
859 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
860 {
861 error (_("%s: did not find a valid archive header\n"),
862 arch->file_name);
863 return NULL;
864 }
865
866 return get_archive_member_name (arch, nested_arch);
867 }
868
869 /* Construct a string showing the name of the archive member, qualified
870 with the name of the containing archive file. For thin archives, we
871 use square brackets to denote the indirection. For nested archives,
872 we show the qualified name of the external member inside the square
873 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
874
875 char *
876 make_qualified_name (struct archive_info * arch,
877 struct archive_info * nested_arch,
878 const char *member_name)
879 {
880 const char * error_name = _("<corrupt>");
881 size_t len;
882 char * name;
883
884 len = strlen (arch->file_name) + strlen (member_name) + 3;
885 if (arch->is_thin_archive
886 && arch->nested_member_origin != 0)
887 {
888 /* PR 15140: Allow for corrupt thin archives. */
889 if (nested_arch->file_name)
890 len += strlen (nested_arch->file_name) + 2;
891 else
892 len += strlen (error_name) + 2;
893 }
894
895 name = (char *) malloc (len);
896 if (name == NULL)
897 {
898 error (_("Out of memory\n"));
899 return NULL;
900 }
901
902 if (arch->is_thin_archive
903 && arch->nested_member_origin != 0)
904 {
905 if (nested_arch->file_name)
906 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
907 nested_arch->file_name, member_name);
908 else
909 snprintf (name, len, "%s[%s(%s)]", arch->file_name,
910 error_name, member_name);
911 }
912 else if (arch->is_thin_archive)
913 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
914 else
915 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
916
917 return name;
918 }
This page took 0.050619 seconds and 4 git commands to generate.