/* PEF support for BFD.
- Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
+ Copyright (C) 1999-2014 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,
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"
#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
if (! (table.flags2 & TB_NAME_PRESENT))
return -1;
- if (! table.flags1 & TB_HAS_TBOFF)
+ if (! (table.flags1 & TB_HAS_TBOFF))
return -1;
offset = 8;
offset += 4;
if (file != NULL)
- fprintf (file, " [length = 0x%lx]", (long) offset);
+ fprintf (file, " [length = 0x%lx]", (unsigned long) offset);
return offset;
}
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;
BFD_ASSERT (len == 4);
value = bfd_getb32 (buf);
- symbol->class = value >> 24;
+ symbol->symbol_class = value >> 24;
symbol->name = value & 0x00ffffff;
return 0;
}
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;
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);
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;
}
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;
asymbol sym;
const char *symname;
char *name;
- unsigned long index;
- int ret;
+ unsigned long sym_index;
if (csym && (csym[count] == NULL))
break;
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;
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++)
{
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,
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. */
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),
static int
bfd_pef_xlib_read_header (bfd *abfd, bfd_pef_xlib_header *header)
{
- unsigned char buf[76];
+ unsigned char buf[80];
bfd_seek (abfd, 0, SEEK_SET);
- if (bfd_bread ((void *) buf, 76, abfd) != 76)
+ if (bfd_bread ((void *) buf, sizeof buf, abfd) != sizeof buf)
return -1;
header->tag1 = bfd_getb32 (buf);
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)
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;
}
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. */