X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fi386linux.c;h=6ca50c9fe4ff7f15e3d050d9921591bcaec65602;hb=2a1d8bb3471a074ce35eb8ab9d8eb2093a5ecdb5;hp=83f9965a3c36e50eff79ce068f6338bf98be2197;hpb=3db64b009284dda3a1ce10a91beb1297475e60a7;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/i386linux.c b/bfd/i386linux.c index 83f9965a3c..6ca50c9fe4 100644 --- a/bfd/i386linux.c +++ b/bfd/i386linux.c @@ -1,28 +1,27 @@ /* BFD back-end for linux flavored i386 a.out binaries. - Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001, 2002, 2003, - 2004, 2006, 2007 Free Software Foundation, Inc. + Copyright (C) 1992-2016 Free Software Foundation, Inc. -This file is part of BFD, the Binary File Descriptor library. + 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 -(at your option) any later version. + 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 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -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. */ + 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. */ #define TARGET_PAGE_SIZE 4096 #define ZMAGIC_DISK_BLOCK_SIZE 1024 #define SEGMENT_SIZE TARGET_PAGE_SIZE #define TEXT_START_ADDR 0x0 -#define N_SHARED_LIB(x) 0 #define MACHTYPE_OK(mtype) ((mtype) == M_386 || (mtype) == M_UNKNOWN) @@ -39,7 +38,7 @@ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. /* 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 (i386linux_,OP) +#define MY(OP) CONCAT2 (i386_aout_linux_,OP) #define TARGETNAME "a.out-i386-linux" extern const bfd_target MY(vec); @@ -49,15 +48,13 @@ extern const bfd_target MY(vec); becomes important. */ static void MY_final_link_callback - PARAMS ((bfd *, file_ptr *, file_ptr *, file_ptr *)); + (bfd *, file_ptr *, file_ptr *, file_ptr *); static bfd_boolean i386linux_bfd_final_link - PARAMS ((bfd *, struct bfd_link_info *)); -static bfd_boolean i386linux_write_object_contents PARAMS ((bfd *)); + (bfd *, struct bfd_link_info *); +static bfd_boolean i386linux_write_object_contents (bfd *); static bfd_boolean -i386linux_bfd_final_link (abfd, info) - bfd *abfd; - struct bfd_link_info *info; +i386linux_bfd_final_link (bfd *abfd, struct bfd_link_info *info) { obj_aout_subformat (abfd) = q_magic_format; return NAME(aout,final_link) (abfd, info, MY_final_link_callback); @@ -68,17 +65,16 @@ i386linux_bfd_final_link (abfd, info) /* Set the machine type correctly. */ static bfd_boolean -i386linux_write_object_contents (abfd) - bfd *abfd; +i386linux_write_object_contents (bfd *abfd) { struct external_exec exec_bytes; struct internal_exec *execp = exec_hdr (abfd); - N_SET_MACHTYPE (*execp, M_386); + N_SET_MACHTYPE (execp, M_386); obj_reloc_entry_size (abfd) = RELOC_STD_SIZE; - WRITE_HEADERS(abfd, execp); + WRITE_HEADERS (abfd, execp); return TRUE; } @@ -169,31 +165,12 @@ struct linux_link_hash_table struct fixup *fixup_list; }; -static struct bfd_hash_entry *linux_link_hash_newfunc - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); -static struct bfd_link_hash_table *linux_link_hash_table_create - PARAMS ((bfd *)); -static struct fixup *new_fixup - PARAMS ((struct bfd_link_info *, struct linux_link_hash_entry *, - bfd_vma, int)); -static bfd_boolean linux_link_create_dynamic_sections - PARAMS ((bfd *, struct bfd_link_info *)); -static bfd_boolean linux_add_one_symbol - PARAMS ((struct bfd_link_info *, bfd *, const char *, flagword, asection *, - bfd_vma, const char *, bfd_boolean, bfd_boolean, - struct bfd_link_hash_entry **)); -static bfd_boolean linux_tally_symbols - PARAMS ((struct linux_link_hash_entry *, PTR)); -static bfd_boolean linux_finish_dynamic_link - PARAMS ((bfd *, struct bfd_link_info *)); - /* Routine to create an entry in an Linux link hash table. */ static struct bfd_hash_entry * -linux_link_hash_newfunc (entry, table, string) - struct bfd_hash_entry *entry; - struct bfd_hash_table *table; - const char *string; +linux_link_hash_newfunc (struct bfd_hash_entry *entry, + struct bfd_hash_table *table, + const char *string) { struct linux_link_hash_entry *ret = (struct linux_link_hash_entry *) entry; @@ -220,13 +197,12 @@ linux_link_hash_newfunc (entry, table, string) /* Create a Linux link hash table. */ static struct bfd_link_hash_table * -linux_link_hash_table_create (abfd) - bfd *abfd; +linux_link_hash_table_create (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, amt); + ret = (struct linux_link_hash_table *) bfd_zmalloc (amt); if (ret == (struct linux_link_hash_table *) NULL) return (struct bfd_link_hash_table *) NULL; if (!NAME(aout,link_hash_table_init) (&ret->root, abfd, @@ -237,11 +213,6 @@ linux_link_hash_table_create (abfd) return (struct bfd_link_hash_table *) NULL; } - ret->dynobj = NULL; - ret->fixup_count = 0; - ret->local_builtins = 0; - ret->fixup_list = NULL; - return &ret->root.root; } @@ -257,7 +228,7 @@ linux_link_hash_table_create (abfd) #define linux_link_hash_traverse(table, func, info) \ (aout_link_hash_traverse \ (&(table)->root, \ - (bfd_boolean (*) PARAMS ((struct aout_link_hash_entry *, PTR))) (func), \ + (bfd_boolean (*) (struct aout_link_hash_entry *, void *)) (func), \ (info))) /* Get the Linux link hash table from the info structure. This is @@ -268,11 +239,10 @@ linux_link_hash_table_create (abfd) /* Store the information for a new fixup. */ static struct fixup * -new_fixup (info, h, value, builtin) - struct bfd_link_info *info; - struct linux_link_hash_entry *h; - bfd_vma value; - int builtin; +new_fixup (struct bfd_link_info *info, + struct linux_link_hash_entry *h, + bfd_vma value, + int builtin) { struct fixup *f; @@ -298,12 +268,11 @@ new_fixup (info, h, value, builtin) create it for now. */ static bfd_boolean -linux_link_create_dynamic_sections (abfd, info) - bfd *abfd; - struct bfd_link_info *info ATTRIBUTE_UNUSED; +linux_link_create_dynamic_sections (bfd *abfd, + struct bfd_link_info *info ATTRIBUTE_UNUSED) { flagword flags; - register asection *s; + asection *s; /* Note that we set the SEC_IN_MEMORY flag. */ flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY; @@ -325,18 +294,16 @@ linux_link_create_dynamic_sections (abfd, info) tweaking needed for dynamic linking support. */ static bfd_boolean -linux_add_one_symbol (info, abfd, name, flags, section, value, string, - copy, collect, hashp) - struct bfd_link_info *info; - bfd *abfd; - const char *name; - flagword flags; - asection *section; - bfd_vma value; - const char *string; - bfd_boolean copy; - bfd_boolean collect; - struct bfd_link_hash_entry **hashp; +linux_add_one_symbol (struct bfd_link_info *info, + bfd *abfd, + const char *name, + flagword flags, + asection *section, + bfd_vma value, + const char *string, + bfd_boolean copy, + bfd_boolean collect, + struct bfd_link_hash_entry **hashp) { struct linux_link_hash_entry *h; bfd_boolean insert; @@ -345,17 +312,17 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, If we do, and the defining entry is from a shared library, we need to create the dynamic sections. - FIXME: What if abfd->xvec != info->hash->creator? We may want to - be able to link Linux a.out and ELF objects together, but serious - confusion is possible. */ + FIXME: What if abfd->xvec != info->output_bfd->xvec? We may + want to be able to link Linux a.out and ELF objects together, + but serious confusion is possible. */ insert = FALSE; - if (! info->relocatable + if (! bfd_link_relocatable (info) && linux_hash_table (info)->dynobj == NULL && strcmp (name, SHARABLE_CONFLICTS) == 0 && (flags & BSF_CONSTRUCTOR) != 0 - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { if (! linux_link_create_dynamic_sections (abfd, info)) return FALSE; @@ -364,7 +331,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, } if (bfd_is_abs_section (section) - && abfd->xvec == info->hash->creator) + && abfd->xvec == info->output_bfd->xvec) { h = linux_link_hash_lookup (linux_hash_table (info), name, FALSE, FALSE, FALSE); @@ -425,9 +392,7 @@ linux_add_one_symbol (info, abfd, name, flags, section, value, string, This function is called via linux_link_hash_traverse. */ static bfd_boolean -linux_tally_symbols (h, data) - struct linux_link_hash_entry *h; - PTR data; +linux_tally_symbols (struct linux_link_hash_entry *h, void * data) { struct bfd_link_info *info = (struct bfd_link_info *) data; struct fixup *f, *f1; @@ -435,9 +400,6 @@ linux_tally_symbols (h, data) struct linux_link_hash_entry *h1, *h2; bfd_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 && CONST_STRNEQ (h->root.root.root.string, NEEDS_SHRLIB)) { @@ -551,9 +513,8 @@ linux_tally_symbols (h, data) are required. */ bfd_boolean -bfd_i386linux_size_dynamic_sections (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; +bfd_i386linux_size_dynamic_sections (bfd *output_bfd, + struct bfd_link_info *info) { struct fixup *f; asection *s; @@ -564,7 +525,7 @@ bfd_i386linux_size_dynamic_sections (output_bfd, info) /* First find the fixups... */ linux_link_hash_traverse (linux_hash_table (info), linux_tally_symbols, - (PTR) info); + info); /* If there are builtin fixups, leave room for a marker. This is used by the dynamic linker so that it knows that all that follow @@ -606,9 +567,8 @@ bfd_i386linux_size_dynamic_sections (output_bfd, info) the stuff we need. */ static bfd_boolean -linux_finish_dynamic_link (output_bfd, info) - bfd *output_bfd; - struct bfd_link_info *info; +linux_finish_dynamic_link (bfd *output_bfd, + struct bfd_link_info *info) { asection *s, *os, *is; bfd_byte *fixup_table; @@ -758,7 +718,7 @@ linux_finish_dynamic_link (output_bfd, info) SEEK_SET) != 0) return FALSE; - if (bfd_bwrite ((PTR) s->contents, s->size, output_bfd) != s->size) + if (bfd_bwrite (s->contents, s->size, output_bfd) != s->size) return FALSE; return TRUE;