diff options
Diffstat (limited to 'gcc/collect2.c')
-rw-r--r-- | gcc/collect2.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/gcc/collect2.c b/gcc/collect2.c index 99d9be46dee..6582185cf09 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1817,7 +1817,7 @@ main (int argc, char **argv) if (export_file != 0 && export_file[0]) maybe_unlink (export_file); #endif - if (lto_mode) + if (lto_mode != LTO_MODE_NONE) maybe_run_lto_and_relink (ld1_argv, object_lst, object, false); maybe_unlink (c_file); @@ -2563,16 +2563,23 @@ write_aix_file (FILE *stream, struct id *list) #ifdef OBJECT_FORMAT_NONE -/* Check to make sure the file is an ELF file. LTO objects must - be in ELF format. */ +/* Check to make sure the file is an LTO object file. */ static bool -is_elf_or_coff (const char *prog_name) +maybe_lto_object_file (const char *prog_name) { FILE *f; - char buf[4]; - static char magic[4] = { 0x7f, 'E', 'L', 'F' }; - static char coffmag[2] = { 0x4c, 0x01 }; + unsigned char buf[4]; + int i; + + static unsigned char elfmagic[4] = { 0x7f, 'E', 'L', 'F' }; + static unsigned char coffmagic[2] = { 0x4c, 0x01 }; + static unsigned char machomagic[4][4] = { + { 0xcf, 0xfa, 0xed, 0xfe }, + { 0xce, 0xfa, 0xed, 0xfe }, + { 0xfe, 0xed, 0xfa, 0xcf }, + { 0xfe, 0xed, 0xfa, 0xce } + }; f = fopen (prog_name, "rb"); if (f == NULL) @@ -2580,8 +2587,15 @@ is_elf_or_coff (const char *prog_name) if (fread (buf, sizeof (buf), 1, f) != 1) buf[0] = 0; fclose (f); - return memcmp (buf, magic, sizeof (magic)) == 0 - || memcmp (buf, coffmag, sizeof (coffmag)) == 0; + + if (memcmp (buf, elfmagic, sizeof (elfmagic)) == 0 + || memcmp (buf, coffmagic, sizeof (coffmagic)) == 0) + return true; + for (i = 0; i < 4; i++) + if (memcmp (buf, machomagic[i], sizeof (machomagic[i])) == 0) + return true; + + return false; } /* Generic version to scan the name list of the loaded program for @@ -2611,7 +2625,7 @@ scan_prog_file (const char *prog_name, scanpass which_pass, /* LTO objects must be in a known format. This check prevents us from accepting an archive containing LTO objects, which gcc cannnot currently handle. */ - if (which_pass == PASS_LTOINFO && !is_elf_or_coff (prog_name)) + if (which_pass == PASS_LTOINFO && !maybe_lto_object_file (prog_name)) return; /* If we do not have an `nm', complain. */ |