1 /* elfedit.c -- Update the ELF header of an ELF format file
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
28 /* Define BFD64 here, even if our default architecture is 32 bit ELF
29 as this will allow us to read in and parse 64bit and 32bit ELF files.
30 Only do this if we believe that the compiler can support a 64 bit
31 data type. For now we only rely on GCC being able to do this. */
38 #include "elf/common.h"
39 #include "elf/external.h"
40 #include "elf/internal.h"
46 #include "libiberty.h"
47 #include "safe-ctype.h"
48 #include "filenames.h"
50 char * program_name = "elfedit";
51 static long archive_file_offset;
52 static unsigned long archive_file_size;
53 static Elf_Internal_Ehdr elf_header;
54 static Elf32_External_Ehdr ehdr32;
55 static Elf64_External_Ehdr ehdr64;
56 static int input_elf_machine = -1;
57 static int output_elf_machine = -1;
58 static int input_elf_class = -1;
60 #define streq(a,b) (strcmp ((a), (b)) == 0)
61 #define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
62 #define const_strneq(a,b) (strncmp ((a), (b), sizeof (b) - 1) == 0)
65 non_fatal (const char *message, ...)
69 va_start (args, message);
70 fprintf (stderr, _("%s: Error: "), program_name);
71 vfprintf (stderr, message, args);
75 #define BYTE_GET(field) byte_get (field, sizeof (field))
76 #define BYTE_PUT(field, val) byte_put (field, val, sizeof (field))
78 static bfd_vma (*byte_get) (unsigned char *, int);
79 static void (*byte_put) (unsigned char *, bfd_vma, int);
82 byte_get_little_endian (unsigned char *field, int size)
90 return ((unsigned int) (field[0]))
91 | (((unsigned int) (field[1])) << 8);
94 return ((unsigned long) (field[0]))
95 | (((unsigned long) (field[1])) << 8)
96 | (((unsigned long) (field[2])) << 16)
97 | (((unsigned long) (field[3])) << 24);
100 if (sizeof (bfd_vma) == 8)
101 return ((bfd_vma) (field[0]))
102 | (((bfd_vma) (field[1])) << 8)
103 | (((bfd_vma) (field[2])) << 16)
104 | (((bfd_vma) (field[3])) << 24)
105 | (((bfd_vma) (field[4])) << 32)
106 | (((bfd_vma) (field[5])) << 40)
107 | (((bfd_vma) (field[6])) << 48)
108 | (((bfd_vma) (field[7])) << 56);
109 else if (sizeof (bfd_vma) == 4)
110 /* We want to extract data from an 8 byte wide field and
111 place it into a 4 byte wide field. Since this is a little
112 endian source we can just use the 4 byte extraction code. */
113 return ((unsigned long) (field[0]))
114 | (((unsigned long) (field[1])) << 8)
115 | (((unsigned long) (field[2])) << 16)
116 | (((unsigned long) (field[3])) << 24);
119 non_fatal (_("Unhandled data length: %d\n"), size);
125 byte_get_big_endian (unsigned char *field, int size)
133 return ((unsigned int) (field[1])) | (((int) (field[0])) << 8);
136 return ((unsigned long) (field[3]))
137 | (((unsigned long) (field[2])) << 8)
138 | (((unsigned long) (field[1])) << 16)
139 | (((unsigned long) (field[0])) << 24);
142 if (sizeof (bfd_vma) == 8)
143 return ((bfd_vma) (field[7]))
144 | (((bfd_vma) (field[6])) << 8)
145 | (((bfd_vma) (field[5])) << 16)
146 | (((bfd_vma) (field[4])) << 24)
147 | (((bfd_vma) (field[3])) << 32)
148 | (((bfd_vma) (field[2])) << 40)
149 | (((bfd_vma) (field[1])) << 48)
150 | (((bfd_vma) (field[0])) << 56);
151 else if (sizeof (bfd_vma) == 4)
153 /* Although we are extracing data from an 8 byte wide field,
154 we are returning only 4 bytes of data. */
156 return ((unsigned long) (field[3]))
157 | (((unsigned long) (field[2])) << 8)
158 | (((unsigned long) (field[1])) << 16)
159 | (((unsigned long) (field[0])) << 24);
163 non_fatal (_("Unhandled data length: %d\n"), size);
169 byte_put_little_endian (unsigned char * field, bfd_vma value, int size)
174 field[7] = (((value >> 24) >> 24) >> 8) & 0xff;
175 field[6] = ((value >> 24) >> 24) & 0xff;
176 field[5] = ((value >> 24) >> 16) & 0xff;
177 field[4] = ((value >> 24) >> 8) & 0xff;
180 field[3] = (value >> 24) & 0xff;
181 field[2] = (value >> 16) & 0xff;
184 field[1] = (value >> 8) & 0xff;
187 field[0] = value & 0xff;
191 non_fatal (_("Unhandled data length: %d\n"), size);
197 byte_put_big_endian (unsigned char * field, bfd_vma value, int size)
202 field[7] = value & 0xff;
203 field[6] = (value >> 8) & 0xff;
204 field[5] = (value >> 16) & 0xff;
205 field[4] = (value >> 24) & 0xff;
210 field[3] = value & 0xff;
211 field[2] = (value >> 8) & 0xff;
215 field[1] = value & 0xff;
219 field[0] = value & 0xff;
223 non_fatal (_("Unhandled data length: %d\n"), size);
229 update_elf_header (const char *file_name, FILE *file)
231 int class, machine, status;
233 if (elf_header.e_ident[EI_MAG0] != ELFMAG0
234 || elf_header.e_ident[EI_MAG1] != ELFMAG1
235 || elf_header.e_ident[EI_MAG2] != ELFMAG2
236 || elf_header.e_ident[EI_MAG3] != ELFMAG3)
239 (_("%s: Not an ELF file - wrong magic bytes at the start\n"),
244 if (elf_header.e_ident[EI_VERSION] != EV_CURRENT)
247 (_("%s: Unsupported EI_VERSION: %d is not %d\n"),
248 file_name, elf_header.e_ident[EI_VERSION],
253 /* Return if e_machine is the same as output_elf_machine. */
254 if (output_elf_machine == elf_header.e_machine)
257 class = elf_header.e_ident[EI_CLASS];
259 /* Skip if class doesn't match. */
260 if (input_elf_class != -1 && class != input_elf_class)
263 (_("%s: Unmatched EI_CLASS: %d is not %d\n"),
264 file_name, class, input_elf_class);
268 machine = elf_header.e_machine;
270 /* Skip if e_machine doesn't match. */
271 if (input_elf_machine != -1 && machine != input_elf_machine)
274 (_("%s: Unmatched e_machine: %d is not %d\n"),
275 file_name, machine, input_elf_machine);
279 /* Update e_machine. */
283 /* We should never get here. */
287 BYTE_PUT (ehdr32.e_machine, output_elf_machine);
288 status = fwrite (&ehdr32, sizeof (ehdr32), 1, file) == 1;
291 BYTE_PUT (ehdr64.e_machine, output_elf_machine);
292 status = fwrite (&ehdr64, sizeof (ehdr64), 1, file) == 1;
297 non_fatal (_("%s: Failed to update ELF header: %s\n"),
298 file_name, strerror (errno));
304 get_file_header (FILE * file)
306 /* Read in the identity array. */
307 if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
310 /* Determine how to read the rest of the header. */
311 switch (elf_header.e_ident[EI_DATA])
313 default: /* fall through */
314 case ELFDATANONE: /* fall through */
316 byte_get = byte_get_little_endian;
317 byte_put = byte_put_little_endian;
320 byte_get = byte_get_big_endian;
321 byte_put = byte_put_big_endian;
325 /* Read in the rest of the header. For now we only support 32 bit
326 and 64 bit ELF files. */
327 switch (elf_header.e_ident[EI_CLASS])
330 non_fatal (_("Unsupported EI_CLASS: %d\n"),
331 elf_header.e_ident[EI_CLASS]);
335 if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT,
339 elf_header.e_type = BYTE_GET (ehdr32.e_type);
340 elf_header.e_machine = BYTE_GET (ehdr32.e_machine);
341 elf_header.e_version = BYTE_GET (ehdr32.e_version);
342 elf_header.e_entry = BYTE_GET (ehdr32.e_entry);
343 elf_header.e_phoff = BYTE_GET (ehdr32.e_phoff);
344 elf_header.e_shoff = BYTE_GET (ehdr32.e_shoff);
345 elf_header.e_flags = BYTE_GET (ehdr32.e_flags);
346 elf_header.e_ehsize = BYTE_GET (ehdr32.e_ehsize);
347 elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
348 elf_header.e_phnum = BYTE_GET (ehdr32.e_phnum);
349 elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
350 elf_header.e_shnum = BYTE_GET (ehdr32.e_shnum);
351 elf_header.e_shstrndx = BYTE_GET (ehdr32.e_shstrndx);
353 memcpy (&ehdr32, &elf_header, EI_NIDENT);
357 /* If we have been compiled with sizeof (bfd_vma) == 4, then
358 we will not be able to cope with the 64bit data found in
359 64 ELF files. Detect this now and abort before we start
360 overwriting things. */
361 if (sizeof (bfd_vma) < 8)
363 non_fatal (_("This executable has been built without support for a\n\
364 64 bit data type and so it cannot process 64 bit ELF files.\n"));
368 if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT,
372 elf_header.e_type = BYTE_GET (ehdr64.e_type);
373 elf_header.e_machine = BYTE_GET (ehdr64.e_machine);
374 elf_header.e_version = BYTE_GET (ehdr64.e_version);
375 elf_header.e_entry = BYTE_GET (ehdr64.e_entry);
376 elf_header.e_phoff = BYTE_GET (ehdr64.e_phoff);
377 elf_header.e_shoff = BYTE_GET (ehdr64.e_shoff);
378 elf_header.e_flags = BYTE_GET (ehdr64.e_flags);
379 elf_header.e_ehsize = BYTE_GET (ehdr64.e_ehsize);
380 elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
381 elf_header.e_phnum = BYTE_GET (ehdr64.e_phnum);
382 elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
383 elf_header.e_shnum = BYTE_GET (ehdr64.e_shnum);
384 elf_header.e_shstrndx = BYTE_GET (ehdr64.e_shstrndx);
386 memcpy (&ehdr64, &elf_header, EI_NIDENT);
392 /* Process one ELF object file according to the command line options.
393 This file may actually be stored in an archive. The file is
394 positioned at the start of the ELF object. */
397 process_object (const char *file_name, FILE *file)
399 /* Rememeber where we are. */
400 long offset = ftell (file);
402 if (! get_file_header (file))
404 non_fatal (_("%s: Failed to read ELF header\n"), file_name);
408 /* Go to the position of the ELF header. */
409 if (fseek (file, offset, SEEK_SET) != 0)
411 non_fatal (_("%s: Failed to seek to ELF header\n"), file_name);
414 if (! update_elf_header (file_name, file))
420 /* Return the path name for a proxy entry in a thin archive, adjusted relative
421 to the path name of the thin archive itself if necessary. Always returns
422 a pointer to malloc'ed memory. */
425 adjust_relative_path (const char *file_name, char * name, int name_len)
427 char * member_file_name;
428 const char * base_name = lbasename (file_name);
430 /* This is a proxy entry for a thin archive member.
431 If the extended name table contains an absolute path
432 name, or if the archive is in the current directory,
433 use the path name as given. Otherwise, we need to
434 find the member relative to the directory where the
435 archive is located. */
436 if (IS_ABSOLUTE_PATH (name) || base_name == file_name)
438 member_file_name = malloc (name_len + 1);
439 if (member_file_name == NULL)
441 non_fatal (_("Out of memory\n"));
444 memcpy (member_file_name, name, name_len);
445 member_file_name[name_len] = '\0';
449 /* Concatenate the path components of the archive file name
450 to the relative path name from the extended name table. */
451 size_t prefix_len = base_name - file_name;
452 member_file_name = malloc (prefix_len + name_len + 1);
453 if (member_file_name == NULL)
455 non_fatal (_("Out of memory\n"));
458 memcpy (member_file_name, file_name, prefix_len);
459 memcpy (member_file_name + prefix_len, name, name_len);
460 member_file_name[prefix_len + name_len] = '\0';
462 return member_file_name;
465 /* Structure to hold information about an archive file. */
469 char * file_name; /* Archive file name. */
470 FILE * file; /* Open file descriptor. */
471 unsigned long index_num; /* Number of symbols in table. */
472 unsigned long * index_array; /* The array of member offsets. */
473 char * sym_table; /* The symbol table. */
474 unsigned long sym_size; /* Size of the symbol table. */
475 char * longnames; /* The long file names table. */
476 unsigned long longnames_size; /* Size of the long file names table. */
477 unsigned long nested_member_origin; /* Origin in the nested archive of the current member. */
478 unsigned long next_arhdr_offset; /* Offset of the next archive header. */
479 bfd_boolean is_thin_archive; /* TRUE if this is a thin archive. */
480 struct ar_hdr arhdr; /* Current archive header. */
483 /* Read the symbol table and long-name table from an archive. */
486 setup_archive (struct archive_info * arch, const char * file_name,
487 FILE * file, bfd_boolean is_thin_archive)
492 arch->file_name = strdup (file_name);
495 arch->index_array = NULL;
496 arch->sym_table = NULL;
498 arch->longnames = NULL;
499 arch->longnames_size = 0;
500 arch->nested_member_origin = 0;
501 arch->is_thin_archive = is_thin_archive;
502 arch->next_arhdr_offset = SARMAG;
504 /* Read the first archive member header. */
505 if (fseek (file, SARMAG, SEEK_SET) != 0)
507 non_fatal (_("%s: failed to seek to first archive header\n"),
511 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
512 if (got != sizeof arch->arhdr)
517 non_fatal (_("%s: failed to read archive header\n"), file_name);
521 /* See if this is the archive symbol table. */
522 if (const_strneq (arch->arhdr.ar_name, "/ ")
523 || const_strneq (arch->arhdr.ar_name, "/SYM64/ "))
525 size = strtoul (arch->arhdr.ar_size, NULL, 10);
526 size = size + (size & 1);
528 arch->next_arhdr_offset += sizeof arch->arhdr + size;
530 if (fseek (file, size, SEEK_CUR) != 0)
532 non_fatal (_("%s: failed to skip archive symbol table\n"),
537 /* Read the next archive header. */
538 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, file);
539 if (got != sizeof arch->arhdr)
543 non_fatal (_("%s: failed to read archive header following archive index\n"),
549 if (const_strneq (arch->arhdr.ar_name, "// "))
551 /* This is the archive string table holding long member names. */
552 arch->longnames_size = strtoul (arch->arhdr.ar_size, NULL, 10);
553 arch->next_arhdr_offset += sizeof arch->arhdr + arch->longnames_size;
555 arch->longnames = malloc (arch->longnames_size);
556 if (arch->longnames == NULL)
558 non_fatal (_("Out of memory reading long symbol names in archive\n"));
562 if (fread (arch->longnames, arch->longnames_size, 1, file) != 1)
564 free (arch->longnames);
565 arch->longnames = NULL;
566 non_fatal (_("%s: failed to read long symbol name string table\n")
571 if ((arch->longnames_size & 1) != 0)
578 /* Release the memory used for the archive information. */
581 release_archive (struct archive_info * arch)
583 if (arch->file_name != NULL)
584 free (arch->file_name);
585 if (arch->index_array != NULL)
586 free (arch->index_array);
587 if (arch->sym_table != NULL)
588 free (arch->sym_table);
589 if (arch->longnames != NULL)
590 free (arch->longnames);
593 /* Open and setup a nested archive, if not already open. */
596 setup_nested_archive (struct archive_info * nested_arch, char * member_file_name)
600 /* Have we already setup this archive? */
601 if (nested_arch->file_name != NULL
602 && streq (nested_arch->file_name, member_file_name))
605 /* Close previous file and discard cached information. */
606 if (nested_arch->file != NULL)
607 fclose (nested_arch->file);
608 release_archive (nested_arch);
610 member_file = fopen (member_file_name, "r+b");
611 if (member_file == NULL)
613 return setup_archive (nested_arch, member_file_name, member_file,
618 get_archive_member_name_at (struct archive_info * arch,
619 unsigned long offset,
620 struct archive_info * nested_arch);
622 /* Get the name of an archive member from the current archive header.
623 For simple names, this will modify the ar_name field of the current
624 archive header. For long names, it will return a pointer to the
625 longnames table. For nested archives, it will open the nested archive
626 and get the name recursively. NESTED_ARCH is a single-entry cache so
627 we don't keep rereading the same information from a nested archive. */
630 get_archive_member_name (struct archive_info * arch,
631 struct archive_info * nested_arch)
635 if (arch->arhdr.ar_name[0] == '/')
637 /* We have a long name. */
639 char * member_file_name;
642 arch->nested_member_origin = 0;
643 k = j = strtoul (arch->arhdr.ar_name + 1, &endp, 10);
644 if (arch->is_thin_archive && endp != NULL && * endp == ':')
645 arch->nested_member_origin = strtoul (endp + 1, NULL, 10);
647 while ((j < arch->longnames_size)
648 && (arch->longnames[j] != '\n')
649 && (arch->longnames[j] != '\0'))
651 if (arch->longnames[j-1] == '/')
653 arch->longnames[j] = '\0';
655 if (!arch->is_thin_archive || arch->nested_member_origin == 0)
656 return arch->longnames + k;
658 /* This is a proxy for a member of a nested archive.
659 Find the name of the member in that archive. */
660 member_file_name = adjust_relative_path (arch->file_name,
663 if (member_file_name != NULL
664 && setup_nested_archive (nested_arch, member_file_name) == 0
665 && (member_name = get_archive_member_name_at (nested_arch,
666 arch->nested_member_origin,
669 free (member_file_name);
672 free (member_file_name);
674 /* Last resort: just return the name of the nested archive. */
675 return arch->longnames + k;
678 /* We have a normal (short) name. */
680 while ((arch->arhdr.ar_name[j] != '/') && (j < 16))
682 arch->arhdr.ar_name[j] = '\0';
683 return arch->arhdr.ar_name;
686 /* Get the name of an archive member at a given OFFSET within an
690 get_archive_member_name_at (struct archive_info * arch,
691 unsigned long offset,
692 struct archive_info * nested_arch)
696 if (fseek (arch->file, offset, SEEK_SET) != 0)
698 non_fatal (_("%s: failed to seek to next file name\n"),
702 got = fread (&arch->arhdr, 1, sizeof arch->arhdr, arch->file);
703 if (got != sizeof arch->arhdr)
705 non_fatal (_("%s: failed to read archive header\n"),
709 if (memcmp (arch->arhdr.ar_fmag, ARFMAG, 2) != 0)
711 non_fatal (_("%s: did not find a valid archive header\n"),
716 return get_archive_member_name (arch, nested_arch);
719 /* Construct a string showing the name of the archive member, qualified
720 with the name of the containing archive file. For thin archives, we
721 use square brackets to denote the indirection. For nested archives,
722 we show the qualified name of the external member inside the square
723 brackets (e.g., "thin.a[normal.a(foo.o)]"). */
726 make_qualified_name (struct archive_info * arch,
727 struct archive_info * nested_arch,
733 len = strlen (arch->file_name) + strlen (member_name) + 3;
734 if (arch->is_thin_archive && arch->nested_member_origin != 0)
735 len += strlen (nested_arch->file_name) + 2;
740 non_fatal (_("Out of memory\n"));
744 if (arch->is_thin_archive && arch->nested_member_origin != 0)
745 snprintf (name, len, "%s[%s(%s)]", arch->file_name, nested_arch->file_name, member_name);
746 else if (arch->is_thin_archive)
747 snprintf (name, len, "%s[%s]", arch->file_name, member_name);
749 snprintf (name, len, "%s(%s)", arch->file_name, member_name);
754 /* Process an ELF archive.
755 On entry the file is positioned just after the ARMAG string. */
758 process_archive (const char * file_name, FILE * file,
759 bfd_boolean is_thin_archive)
761 struct archive_info arch;
762 struct archive_info nested_arch;
764 size_t file_name_size;
767 /* The ARCH structure is used to hold information about this archive. */
768 arch.file_name = NULL;
770 arch.index_array = NULL;
771 arch.sym_table = NULL;
772 arch.longnames = NULL;
774 /* The NESTED_ARCH structure is used as a single-item cache of information
775 about a nested archive (when members of a thin archive reside within
776 another regular archive file). */
777 nested_arch.file_name = NULL;
778 nested_arch.file = NULL;
779 nested_arch.index_array = NULL;
780 nested_arch.sym_table = NULL;
781 nested_arch.longnames = NULL;
783 if (setup_archive (&arch, file_name, file, is_thin_archive) != 0)
789 file_name_size = strlen (file_name);
796 char * qualified_name;
798 /* Read the next archive header. */
799 if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
801 non_fatal (_("%s: failed to seek to next archive header\n"),
805 got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
806 if (got != sizeof arch.arhdr)
810 non_fatal (_("%s: failed to read archive header\n"),
815 if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
817 non_fatal (_("%s: did not find a valid archive header\n"),
823 arch.next_arhdr_offset += sizeof arch.arhdr;
825 archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
826 if (archive_file_size & 01)
829 name = get_archive_member_name (&arch, &nested_arch);
832 non_fatal (_("%s: bad archive file name\n"), file_name);
836 namelen = strlen (name);
838 qualified_name = make_qualified_name (&arch, &nested_arch, name);
839 if (qualified_name == NULL)
841 non_fatal (_("%s: bad archive file name\n"), file_name);
846 if (is_thin_archive && arch.nested_member_origin == 0)
848 /* This is a proxy for an external member of a thin archive. */
850 char *member_file_name = adjust_relative_path (file_name,
852 if (member_file_name == NULL)
858 member_file = fopen (member_file_name, "r+b");
859 if (member_file == NULL)
861 non_fatal (_("Input file '%s' is not readable\n"),
863 free (member_file_name);
868 archive_file_offset = arch.nested_member_origin;
870 ret |= process_object (qualified_name, member_file);
872 fclose (member_file);
873 free (member_file_name);
875 else if (is_thin_archive)
877 /* This is a proxy for a member of a nested archive. */
878 archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
880 /* The nested archive file will have been opened and setup by
881 get_archive_member_name. */
882 if (fseek (nested_arch.file, archive_file_offset,
885 non_fatal (_("%s: failed to seek to archive member\n"),
886 nested_arch.file_name);
891 ret |= process_object (qualified_name, nested_arch.file);
895 archive_file_offset = arch.next_arhdr_offset;
896 arch.next_arhdr_offset += archive_file_size;
898 ret |= process_object (qualified_name, file);
901 free (qualified_name);
905 if (nested_arch.file != NULL)
906 fclose (nested_arch.file);
907 release_archive (&nested_arch);
908 release_archive (&arch);
914 check_file (const char *file_name, struct stat *statbuf_p)
918 if (statbuf_p == NULL)
919 statbuf_p = &statbuf;
921 if (stat (file_name, statbuf_p) < 0)
924 non_fatal (_("'%s': No such file\n"), file_name);
926 non_fatal (_("Could not locate '%s'. System error message: %s\n"),
927 file_name, strerror (errno));
931 if (! S_ISREG (statbuf_p->st_mode))
933 non_fatal (_("'%s' is not an ordinary file\n"), file_name);
941 process_file (const char *file_name)
947 if (check_file (file_name, NULL))
950 file = fopen (file_name, "r+b");
953 non_fatal (_("Input file '%s' is not readable\n"), file_name);
957 if (fread (armag, SARMAG, 1, file) != 1)
959 non_fatal (_("%s: Failed to read file's magic number\n"),
965 if (memcmp (armag, ARMAG, SARMAG) == 0)
966 ret = process_archive (file_name, file, FALSE);
967 else if (memcmp (armag, ARMAGT, SARMAG) == 0)
968 ret = process_archive (file_name, file, TRUE);
972 archive_file_size = archive_file_offset = 0;
973 ret = process_object (file_name, file);
981 /* Return EM_XXX for a machine string, MACH. */
984 elf_machine (const char *mach)
986 if (strcasecmp (mach, "l1om") == 0)
988 if (strcasecmp (mach, "x86_64") == 0)
990 if (strcasecmp (mach, "x86-64") == 0)
992 if (strcasecmp (mach, "none") == 0)
995 non_fatal (_("Unknown machine type: %s\n"), mach);
1000 /* Return ELF class for a machine type, MACH. */
1003 elf_class (int mach)
1011 return ELFCLASSNONE;
1013 non_fatal (_("Unknown machine type: %d\n"), mach);
1018 enum command_line_switch
1020 OPTION_INPUT_MACH = 150,
1024 static struct option options[] =
1026 {"input-mach", required_argument, 0, OPTION_INPUT_MACH},
1027 {"output-mach", required_argument, 0, OPTION_OUTPUT_MACH},
1028 {"version", no_argument, 0, 'v'},
1029 {"help", no_argument, 0, 'h'},
1030 {0, no_argument, 0, 0}
1034 usage (FILE *stream, int exit_status)
1036 fprintf (stream, _("Usage: %s [option(s)] --output-mach <machine> elffile(s)\n"),
1038 fprintf (stream, _(" Update the ELF header of ELF files\n"));
1039 fprintf (stream, _(" The options are:\n"));
1040 fprintf (stream, _("\
1041 --input-mach <machine> Set input machine type to <machine>\n\
1042 --output-mach <machine> Set output machine type to <machine>\n\
1043 -h --help Display this information\n\
1044 -v --version Display the version number of %s\n\
1047 if (REPORT_BUGS_TO[0] && exit_status == 0)
1048 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
1053 main (int argc, char ** argv)
1057 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1058 setlocale (LC_MESSAGES, "");
1060 #if defined (HAVE_SETLOCALE)
1061 setlocale (LC_CTYPE, "");
1063 bindtextdomain (PACKAGE, LOCALEDIR);
1064 textdomain (PACKAGE);
1066 expandargv (&argc, &argv);
1068 while ((c = getopt_long (argc, argv, "hv",
1069 options, (int *) 0)) != EOF)
1073 case OPTION_INPUT_MACH:
1074 input_elf_machine = elf_machine (optarg);
1075 if (input_elf_machine < 0)
1077 input_elf_class = elf_class (input_elf_machine);
1078 if (input_elf_class < 0)
1082 case OPTION_OUTPUT_MACH:
1083 output_elf_machine = elf_machine (optarg);
1084 if (output_elf_machine < 0)
1092 print_version (program_name);
1100 if (optind == argc || output_elf_machine == -1)
1104 while (optind < argc)
1105 status |= process_file (argv[optind++]);