X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fpef.c;h=6c52e0f3590c28d8fadfe356b36f86adf82a14e5;hb=b47468a6dbd1b54c44c2edc0f7db64a073d894ea;hp=d9e05b1d52627ed703af10d264a6319137c81cd2;hpb=3e110533652d0f94211681ab718b7471f8bd3493;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/pef.c b/bfd/pef.c index d9e05b1d52..6c52e0f359 100644 --- a/bfd/pef.c +++ b/bfd/pef.c @@ -1,12 +1,12 @@ /* PEF support for BFD. - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2011 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,13 +16,18 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ +/* PEF (Preferred Executable Format) is the binary file format for late + classic Mac OS versions (before Darwin). It is supported by both m68k + and PowerPc. It is also called CFM (Code Fragment Manager). */ + +#include "sysdep.h" #include "safe-ctype.h" #include "pef.h" #include "pef-traceback.h" #include "bfd.h" -#include "sysdep.h" #include "libbfd.h" #include "libiberty.h" @@ -37,26 +42,28 @@ #define bfd_pef_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false) #define bfd_pef_get_lineno _bfd_nosymbols_get_lineno #define bfd_pef_find_nearest_line _bfd_nosymbols_find_nearest_line +#define bfd_pef_find_inliner_info _bfd_nosymbols_find_inliner_info #define bfd_pef_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol #define bfd_pef_read_minisymbols _bfd_generic_read_minisymbols #define bfd_pef_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol -#define bfd_pef_get_reloc_upper_bound _bfd_norelocs_get_reloc_upper_bound -#define bfd_pef_canonicalize_reloc _bfd_norelocs_canonicalize_reloc -#define bfd_pef_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup #define bfd_pef_set_arch_mach _bfd_generic_set_arch_mach #define bfd_pef_get_section_contents _bfd_generic_get_section_contents #define bfd_pef_set_section_contents _bfd_generic_set_section_contents #define bfd_pef_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents #define bfd_pef_bfd_relax_section bfd_generic_relax_section #define bfd_pef_bfd_gc_sections bfd_generic_gc_sections +#define bfd_pef_bfd_lookup_section_flags bfd_generic_lookup_section_flags #define bfd_pef_bfd_merge_sections bfd_generic_merge_sections #define bfd_pef_bfd_is_group_section bfd_generic_is_group_section #define bfd_pef_bfd_discard_group bfd_generic_discard_group #define bfd_pef_section_already_linked _bfd_generic_section_already_linked +#define bfd_pef_bfd_define_common_symbol bfd_generic_define_common_symbol #define bfd_pef_bfd_link_hash_table_create _bfd_generic_link_hash_table_create #define bfd_pef_bfd_link_hash_table_free _bfd_generic_link_hash_table_free #define bfd_pef_bfd_link_add_symbols _bfd_generic_link_add_symbols #define bfd_pef_bfd_link_just_syms _bfd_generic_link_just_syms +#define bfd_pef_bfd_copy_link_hash_symbol_type \ + _bfd_generic_copy_link_hash_symbol_type #define bfd_pef_bfd_final_link _bfd_generic_final_link #define bfd_pef_bfd_link_split_section _bfd_generic_link_split_section #define bfd_pef_get_section_contents_in_window _bfd_generic_get_section_contents_in_window @@ -98,7 +105,7 @@ bfd_pef_parse_traceback_table (bfd *abfd, if (! (table.flags2 & TB_NAME_PRESENT)) return -1; - if (! table.flags1 & TB_HAS_TBOFF) + if (! (table.flags1 & TB_HAS_TBOFF)) return -1; offset = 8; @@ -187,7 +194,7 @@ bfd_pef_parse_traceback_table (bfd *abfd, offset += 4; if (file != NULL) - fprintf (file, " [length = 0x%lx]", (long) offset); + fprintf (file, " [length = 0x%lx]", (unsigned long) offset); return offset; } @@ -208,7 +215,7 @@ bfd_pef_print_symbol (bfd *abfd, default: bfd_print_symbol_vandf (abfd, (void *) file, symbol); fprintf (file, " %-5s %s", symbol->section->name, symbol->name); - if (strncmp (symbol->name, "__traceback_", strlen ("__traceback_")) == 0) + if (CONST_STRNEQ (symbol->name, "__traceback_")) { unsigned char *buf = alloca (symbol->udata.i); size_t offset = symbol->value + 4; @@ -361,7 +368,7 @@ bfd_pef_parse_imported_symbol (bfd *abfd ATTRIBUTE_UNUSED, BFD_ASSERT (len == 4); value = bfd_getb32 (buf); - symbol->class = value >> 24; + symbol->symbol_class = value >> 24; symbol->name = value & 0x00ffffff; return 0; @@ -500,10 +507,9 @@ bfd_pef_scan_start_address (bfd *abfd) } int -bfd_pef_scan (abfd, header, mdata) - bfd *abfd; - bfd_pef_header *header; - bfd_pef_data_struct *mdata; +bfd_pef_scan (bfd *abfd, + bfd_pef_header *header, + bfd_pef_data_struct *mdata) { unsigned int i; enum bfd_architecture cputype; @@ -514,8 +520,8 @@ bfd_pef_scan (abfd, header, mdata) bfd_pef_convert_architecture (header->architecture, &cputype, &cpusubtype); if (cputype == bfd_arch_unknown) { - fprintf (stderr, "bfd_pef_scan: unknown architecture 0x%lx\n", - header->architecture); + (*_bfd_error_handler) (_("bfd_pef_scan: unknown architecture 0x%lx"), + header->architecture); return -1; } bfd_set_arch_mach (abfd, cputype, cpusubtype); @@ -577,34 +583,28 @@ bfd_pef_read_header (bfd *abfd, bfd_pef_header *header) static const bfd_target * bfd_pef_object_p (bfd *abfd) { - struct bfd_preserve preserve; bfd_pef_header header; + bfd_pef_data_struct *mdata; - preserve.marker = NULL; if (bfd_pef_read_header (abfd, &header) != 0) goto wrong; if (header.tag1 != BFD_PEF_TAG1 || header.tag2 != BFD_PEF_TAG2) goto wrong; - preserve.marker = bfd_zalloc (abfd, sizeof (bfd_pef_data_struct)); - if (preserve.marker == NULL - || !bfd_preserve_save (abfd, &preserve)) + mdata = (bfd_pef_data_struct *) bfd_zalloc (abfd, sizeof (*mdata)); + if (mdata == NULL) goto fail; - if (bfd_pef_scan (abfd, &header, - (bfd_pef_data_struct *) preserve.marker) != 0) + if (bfd_pef_scan (abfd, &header, mdata)) goto wrong; - bfd_preserve_finish (abfd, &preserve); return abfd->xvec; wrong: bfd_set_error (bfd_error_wrong_format); fail: - if (preserve.marker != NULL) - bfd_preserve_restore (abfd, &preserve); return NULL; } @@ -728,14 +728,11 @@ bfd_pef_parse_function_stubs (bfd *abfd, asymbol **csym) { const char *const sprefix = "__stub_"; - size_t codepos = 0; unsigned long count = 0; - bfd_pef_loader_header header; bfd_pef_imported_library *libraries = NULL; bfd_pef_imported_symbol *imports = NULL; - unsigned long i; int ret; @@ -781,8 +778,7 @@ bfd_pef_parse_function_stubs (bfd *abfd, asymbol sym; const char *symname; char *name; - unsigned long index; - int ret; + unsigned long sym_index; if (csym && (csym[count] == NULL)) break; @@ -800,14 +796,14 @@ bfd_pef_parse_function_stubs (bfd *abfd, if ((codepos + 4) > codelen) break; - ret = bfd_pef_parse_function_stub (abfd, codebuf + codepos, 24, &index); + ret = bfd_pef_parse_function_stub (abfd, codebuf + codepos, 24, &sym_index); if (ret < 0) { codepos += 24; continue; } - if (index >= header.total_imported_symbol_count) + if (sym_index >= header.total_imported_symbol_count) { codepos += 24; continue; @@ -817,12 +813,12 @@ bfd_pef_parse_function_stubs (bfd *abfd, size_t max, namelen; const char *s; - if (loaderlen < (header.loader_strings_offset + imports[index].name)) + if (loaderlen < (header.loader_strings_offset + imports[sym_index].name)) goto error; - max = loaderlen - (header.loader_strings_offset + imports[index].name); + max = loaderlen - (header.loader_strings_offset + imports[sym_index].name); symname = (char *) loaderbuf; - symname += header.loader_strings_offset + imports[index].name; + symname += header.loader_strings_offset + imports[sym_index].name; namelen = 0; for (s = symname; s < (symname + max); s++) { @@ -986,11 +982,7 @@ bfd_pef_canonicalize_symtab (bfd *abfd, asymbol **alocation) return ret; } -static asymbol * -bfd_pef_make_empty_symbol (bfd *abfd) -{ - return bfd_alloc (abfd, sizeof (asymbol)); -} +#define bfd_pef_make_empty_symbol _bfd_generic_make_empty_symbol static void bfd_pef_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, @@ -1001,7 +993,8 @@ bfd_pef_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED, } static int -bfd_pef_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean exec ATTRIBUTE_UNUSED) +bfd_pef_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED, + struct bfd_link_info *info ATTRIBUTE_UNUSED) { return 0; } @@ -1020,6 +1013,7 @@ const bfd_target pef_vec = 0, /* Symbol_leading_char. */ ' ', /* AR_pad_char. */ 16, /* AR_max_namelen. */ + 0, /* match priority. */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */ @@ -1050,7 +1044,7 @@ const bfd_target pef_vec = BFD_JUMP_TABLE_CORE (_bfd_nocore), BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), BFD_JUMP_TABLE_SYMBOLS (bfd_pef), - BFD_JUMP_TABLE_RELOCS (bfd_pef), + BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), BFD_JUMP_TABLE_WRITE (bfd_pef), BFD_JUMP_TABLE_LINK (bfd_pef), BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), @@ -1124,7 +1118,6 @@ bfd_pef_xlib_scan (bfd *abfd, bfd_pef_xlib_header *header) static const bfd_target * bfd_pef_xlib_object_p (bfd *abfd) { - struct bfd_preserve preserve; bfd_pef_xlib_header header; if (bfd_pef_xlib_read_header (abfd, &header) != 0) @@ -1141,20 +1134,12 @@ bfd_pef_xlib_object_p (bfd *abfd) return NULL; } - if (! bfd_preserve_save (abfd, &preserve)) - { - bfd_set_error (bfd_error_wrong_format); - return NULL; - } - if (bfd_pef_xlib_scan (abfd, &header) != 0) { - bfd_preserve_restore (abfd, &preserve); bfd_set_error (bfd_error_wrong_format); return NULL; } - bfd_preserve_finish (abfd, &preserve); return abfd->xvec; } @@ -1172,6 +1157,7 @@ const bfd_target pef_xlib_vec = 0, /* Symbol_leading_char. */ ' ', /* AR_pad_char. */ 16, /* AR_max_namelen. */ + 0, /* match priority. */ bfd_getb64, bfd_getb_signed_64, bfd_putb64, bfd_getb32, bfd_getb_signed_32, bfd_putb32, bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */