X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldwrite.c;h=42eb2cc55fd074b53ebbfdbbc80cf846fabba226;hb=607a83c9432a15cc27bab7677270b1e6dd2d764e;hp=ee9d74a796d6c5a00203ede07f17ae774800aab1;hpb=7b986e992e1a3a388ee0ff0749749f063cc971a6;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldwrite.c b/ld/ldwrite.c index ee9d74a796..42eb2cc55f 100644 --- a/ld/ldwrite.c +++ b/ld/ldwrite.c @@ -1,26 +1,27 @@ /* ldwrite.c -- write out the linked file Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, - 2003, 2004, 2005 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Steve Chamberlain sac@cygnus.com -This file is part of GLD, the Gnu Linker. + This file is part of the GNU Binutils. -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. */ -#include "bfd.h" #include "sysdep.h" +#include "bfd.h" #include "bfdlink.h" #include "libiberty.h" #include "safe-ctype.h" @@ -48,9 +49,9 @@ build_link_order (lang_statement_union_type *statement) bfd_boolean big_endian = FALSE; output_section = statement->data_statement.output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, output_section); if (link_order == NULL) einfo (_("%P%F: bfd_new_link_order failed\n")); @@ -65,9 +66,9 @@ build_link_order (lang_statement_union_type *statement) By convention, the bfd_put routines for an unknown endianness are big endian, so we must swap here if the input file is little endian. */ - if (bfd_big_endian (output_bfd)) + if (bfd_big_endian (link_info.output_bfd)) big_endian = TRUE; - else if (bfd_little_endian (output_bfd)) + else if (bfd_little_endian (link_info.output_bfd)) big_endian = FALSE; else { @@ -131,13 +132,14 @@ build_link_order (lang_statement_union_type *statement) } } - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); switch (statement->data_statement.type) { case QUAD: case SQUAD: if (sizeof (bfd_vma) >= QUAD_SIZE) - bfd_put_64 (output_bfd, value, link_order->u.data.contents); + bfd_put_64 (link_info.output_bfd, value, + link_order->u.data.contents); else { bfd_vma high; @@ -148,25 +150,28 @@ build_link_order (lang_statement_union_type *statement) high = 0; else high = (bfd_vma) -1; - bfd_put_32 (output_bfd, high, + bfd_put_32 (link_info.output_bfd, high, (link_order->u.data.contents + (big_endian ? 0 : 4))); - bfd_put_32 (output_bfd, value, + bfd_put_32 (link_info.output_bfd, value, (link_order->u.data.contents + (big_endian ? 4 : 0))); } link_order->size = QUAD_SIZE; break; case LONG: - bfd_put_32 (output_bfd, value, link_order->u.data.contents); + bfd_put_32 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = LONG_SIZE; break; case SHORT: - bfd_put_16 (output_bfd, value, link_order->u.data.contents); + bfd_put_16 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = SHORT_SIZE; break; case BYTE: - bfd_put_8 (output_bfd, value, link_order->u.data.contents); + bfd_put_8 (link_info.output_bfd, value, + link_order->u.data.contents); link_order->size = BYTE_SIZE; break; default: @@ -184,9 +189,9 @@ build_link_order (lang_statement_union_type *statement) rs = &statement->reloc_statement; output_section = rs->output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, output_section); if (link_order == NULL) einfo (_("%P%F: bfd_new_link_order failed\n")); @@ -201,7 +206,7 @@ build_link_order (lang_statement_union_type *statement) if (rs->name == NULL) { link_order->type = bfd_section_reloc_link_order; - if (rs->section->owner == output_bfd) + if (rs->section->owner == link_info.output_bfd) link_order->u.reloc.p->u.section = rs->section; else { @@ -228,7 +233,7 @@ build_link_order (lang_statement_union_type *statement) { asection *output_section = i->output_section; - ASSERT (output_section->owner == output_bfd); + ASSERT (output_section->owner == link_info.output_bfd); if ((output_section->flags & SEC_HAS_CONTENTS) != 0 || ((output_section->flags & SEC_LOAD) != 0 @@ -236,7 +241,8 @@ build_link_order (lang_statement_union_type *statement) { struct bfd_link_order *link_order; - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, + output_section); if (i->flags & SEC_NEVER_LOAD) { @@ -268,10 +274,14 @@ build_link_order (lang_statement_union_type *statement) output_section = statement->padding_statement.output_section; ASSERT (statement->padding_statement.output_section->owner - == output_bfd); - if ((output_section->flags & SEC_HAS_CONTENTS) != 0) + == link_info.output_bfd); + if (((output_section->flags & SEC_HAS_CONTENTS) != 0 + || ((output_section->flags & SEC_LOAD) != 0 + && (output_section->flags & SEC_THREAD_LOCAL))) + && (output_section->flags & SEC_NEVER_LOAD) == 0) { - link_order = bfd_new_link_order (output_bfd, output_section); + link_order = bfd_new_link_order (link_info.output_bfd, + output_section); link_order->type = bfd_data_link_order; link_order->size = statement->padding_statement.size; link_order->offset = statement->padding_statement.output_offset; @@ -293,7 +303,7 @@ build_link_order (lang_statement_union_type *statement) static bfd_boolean unsplittable_name (const char *name) { - if (strncmp (name, ".stab", 5) == 0) + if (CONST_STRNEQ (name, ".stab")) { /* There are several stab like string sections. We pattern match on ".stab...str" */ @@ -338,7 +348,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count) { /* Some section names cannot be truncated, as the name is used to locate some other section. */ - if (strncmp (name, ".stab", 5) == 0 + if (CONST_STRNEQ (name, ".stab") || strcmp (name, "$GDB_SYMBOLS$") == 0) { einfo (_ ("%F%P: cannot create split section name for %s\n"), name); @@ -553,8 +563,8 @@ ldwrite (void) if (config.split_by_reloc != (unsigned) -1 || config.split_by_file != (bfd_size_type) -1) - split_sections (output_bfd, &link_info); - if (!bfd_final_link (output_bfd, &link_info)) + split_sections (link_info.output_bfd, &link_info); + if (!bfd_final_link (link_info.output_bfd, &link_info)) { /* If there was an error recorded, print it out. Otherwise assume an appropriate error message like unknown symbol was printed