X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fm68klinux.c;h=7dd0428947ee98fb783cef42220c90f120dee7f1;hb=86fb1dece37497b267579ed4f062d280cd5760cd;hp=c8f47a89fb09bcb6e15611cdd9bd3b7b08c7758d;hpb=5b64ad42d36e6d487e1f7287d37fbc243a178e72;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/m68klinux.c b/bfd/m68klinux.c index c8f47a89fb..7dd0428947 100644 --- a/bfd/m68klinux.c +++ b/bfd/m68klinux.c @@ -1,5 +1,6 @@ /* BFD back-end for linux flavored m68k a.out binaries. - Copyright (C) 1992, 93, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc. + Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -36,7 +37,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define TARGET_IS_BIG_ENDIAN_P #define DEFAULT_ARCH bfd_arch_m68k -#define MY(OP) CAT(m68klinux_,OP) + +/* Do not "beautify" the CONCAT* macro args. Traditional C will not + remove whitespace added here, and thus will fail to concatenate + the tokens. */ +#define MY(OP) CONCAT2 (m68klinux_,OP) #define TARGETNAME "a.out-m68k-linux" extern const bfd_target MY(vec); @@ -223,9 +228,9 @@ linux_link_hash_table_create (abfd) bfd *abfd; { struct linux_link_hash_table *ret; + bfd_size_type amt = sizeof (struct linux_link_hash_table); - ret = ((struct linux_link_hash_table *) - bfd_alloc (abfd, sizeof (struct linux_link_hash_table))); + ret = (struct linux_link_hash_table *) bfd_malloc (amt); if (ret == (struct linux_link_hash_table *) NULL) { bfd_set_error (bfd_error_no_memory); @@ -301,7 +306,7 @@ new_fixup (info, h, value, builtin) static boolean linux_link_create_dynamic_sections (abfd, info) bfd *abfd; - struct bfd_link_info *info; + struct bfd_link_info *info ATTRIBUTE_UNUSED; { flagword flags; register asection *s; @@ -408,7 +413,8 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, if (! (_bfd_generic_link_add_one_symbol (info, linux_hash_table (info)->dynobj, SHARABLE_CONFLICTS, - BSF_GLOBAL | BSF_CONSTRUCTOR, s, 0, NULL, false, false, NULL))) + BSF_GLOBAL | BSF_CONSTRUCTOR, s, (bfd_vma) 0, NULL, + false, false, NULL))) return false; } @@ -436,6 +442,9 @@ linux_tally_symbols (h, data) struct linux_link_hash_entry *h1, *h2; boolean exists; + if (h->root.root.type == bfd_link_hash_warning) + h = (struct linux_link_hash_entry *) h->root.root.u.i.link; + if (h->root.root.type == bfd_link_hash_undefined && strncmp (h->root.root.root.string, NEEDS_SHRLIB, sizeof NEEDS_SHRLIB - 1) == 0) @@ -447,7 +456,7 @@ linux_tally_symbols (h, data) name = h->root.root.root.string + sizeof NEEDS_SHRLIB - 1; p = strrchr (name, '_'); if (p != NULL) - alloc = (char *) bfd_malloc (strlen (name) + 1); + alloc = (char *) bfd_malloc ((bfd_size_type) strlen (name) + 1); if (p == NULL || alloc == NULL) (*_bfd_error_handler) (_("Output file requires shared library `%s'\n"), @@ -478,8 +487,8 @@ linux_tally_symbols (h, data) (h->root.root.root.string + sizeof PLT_REF_PREFIX - 1), false, false, true); - /* h2 does not follow indirect symbols. */ - h2 = linux_link_hash_lookup (linux_hash_table (info), + /* h2 does not follow indirect symbols. */ + h2 = linux_link_hash_lookup (linux_hash_table (info), (h->root.root.root.string + sizeof PLT_REF_PREFIX - 1), false, false, false); @@ -535,7 +544,7 @@ linux_tally_symbols (h, data) } /* Quick and dirty way of stripping these symbols from the - symtab. */ + symtab. */ if (bfd_is_abs_section (h->root.root.u.def.section)) h->root.written = true; } @@ -560,7 +569,7 @@ bfd_m68klinux_size_dynamic_sections (output_bfd, info) if (output_bfd->xvec != &MY(vec)) return true; - /* First find the fixups... */ + /* First find the fixups... */ linux_link_hash_traverse (linux_hash_table (info), linux_tally_symbols, (PTR) info); @@ -590,7 +599,8 @@ bfd_m68klinux_size_dynamic_sections (output_bfd, info) ".linux-dynamic"); if (s != NULL) { - s->_raw_size = 8 + linux_hash_table (info)->fixup_count * 8; + s->_raw_size = linux_hash_table (info)->fixup_count + 1; + s->_raw_size *= 8; s->contents = (bfd_byte *) bfd_alloc (output_bfd, s->_raw_size); if (s->contents == NULL) { @@ -630,13 +640,14 @@ linux_finish_dynamic_link (output_bfd, info) fixups_written = 0; #ifdef LINUX_LINK_DEBUG - printf ("Fixup table file offset: %x VMA: %x\n", + printf ("Fixup table file offset: %x VMA: %x\n", os->filepos + s->output_offset, os->vma + s->output_offset); #endif fixup_table = s->contents; - bfd_put_32 (output_bfd, linux_hash_table (info)->fixup_count, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) linux_hash_table (info)->fixup_count, + fixup_table); fixup_table += 4; /* Fill in fixup table. */ @@ -665,14 +676,14 @@ linux_finish_dynamic_link (output_bfd, info) if (f->jump) { - bfd_put_32 (output_bfd, new_addr, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) new_addr, fixup_table); fixup_table += 4; bfd_put_32 (output_bfd, f->value + 2, fixup_table); fixup_table += 4; } else { - bfd_put_32 (output_bfd, new_addr, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) new_addr, fixup_table); fixup_table += 4; bfd_put_32 (output_bfd, f->value, fixup_table); fixup_table += 4; @@ -683,9 +694,9 @@ linux_finish_dynamic_link (output_bfd, info) if (linux_hash_table (info)->local_builtins != 0) { /* Special marker so we know to switch to the other type of fixup */ - bfd_put_32 (output_bfd, 0, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) 0, fixup_table); fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) 0, fixup_table); fixup_table += 4; ++fixups_written; for (f = linux_hash_table (info)->fixup_list; f != NULL; f = f->next) @@ -711,7 +722,7 @@ linux_finish_dynamic_link (output_bfd, info) new_addr, f->value); #endif - bfd_put_32 (output_bfd, new_addr, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) new_addr, fixup_table); fixup_table += 4; bfd_put_32 (output_bfd, f->value, fixup_table); fixup_table += 4; @@ -724,15 +735,15 @@ linux_finish_dynamic_link (output_bfd, info) (*_bfd_error_handler) (_("Warning: fixup count mismatch\n")); while (linux_hash_table (info)->fixup_count > fixups_written) { - bfd_put_32 (output_bfd, 0, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) 0, fixup_table); fixup_table += 4; - bfd_put_32 (output_bfd, 0, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) 0, fixup_table); fixup_table += 4; ++fixups_written; } } - h = linux_link_hash_lookup (linux_hash_table (info), + h = linux_link_hash_lookup (linux_hash_table (info), "__BUILTIN_FIXUPS__", false, false, false); @@ -748,16 +759,16 @@ linux_finish_dynamic_link (output_bfd, info) printf ("Builtin fixup table at %x\n", new_addr); #endif - bfd_put_32 (output_bfd, new_addr, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) new_addr, fixup_table); } else - bfd_put_32 (output_bfd, 0, fixup_table); + bfd_put_32 (output_bfd, (bfd_vma) 0, fixup_table); - if (bfd_seek (output_bfd, os->filepos + s->output_offset, SEEK_SET) != 0) + if (bfd_seek (output_bfd, (file_ptr) (os->filepos + s->output_offset), + SEEK_SET) != 0) return false; - if (bfd_write ((PTR) s->contents, 1, s->_raw_size, output_bfd) - != s->_raw_size) + if (bfd_bwrite ((PTR) s->contents, s->_raw_size, output_bfd) != s->_raw_size) return false; return true;