X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fldwrite.c;h=1cd111d20a38d939c5b593d0858d2a3257ce5dc8;hb=60804c53a0c365f0802e90c12dfcbe6696b861fe;hp=6b8423b568317a22b3d4aebc0fe72deb3b6d129d;hpb=2e76e85a380390ce45e72a41822d29985261a529;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldwrite.c b/ld/ldwrite.c index 6b8423b568..1cd111d20a 100644 --- a/ld/ldwrite.c +++ b/ld/ldwrite.c @@ -1,6 +1,5 @@ /* ldwrite.c -- write out the linked file - Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2002, - 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1991-2017 Free Software Foundation, Inc. Written by Steve Chamberlain sac@cygnus.com This file is part of the GNU Binutils. @@ -51,6 +50,11 @@ build_link_order (lang_statement_union_type *statement) output_section = statement->data_statement.output_section; ASSERT (output_section->owner == link_info.output_bfd); + if (!((output_section->flags & SEC_HAS_CONTENTS) != 0 + || ((output_section->flags & SEC_LOAD) != 0 + && (output_section->flags & SEC_THREAD_LOCAL)))) + break; + 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")); @@ -87,17 +91,17 @@ build_link_order (lang_statement_union_type *statement) big_endian = TRUE; { LANG_FOR_EACH_INPUT_STATEMENT (s) - { - if (s->the_bfd != NULL) - { - if (bfd_little_endian (s->the_bfd)) - { - big_endian = FALSE; - swap = TRUE; - } - break; - } - } + { + if (s->the_bfd != NULL) + { + if (bfd_little_endian (s->the_bfd)) + { + big_endian = FALSE; + swap = TRUE; + } + break; + } + } } } @@ -177,6 +181,7 @@ build_link_order (lang_statement_union_type *statement) default: abort (); } + link_order->u.data.size = link_order->size; } break; @@ -191,6 +196,11 @@ build_link_order (lang_statement_union_type *statement) output_section = rs->output_section; ASSERT (output_section->owner == link_info.output_bfd); + if (!((output_section->flags & SEC_HAS_CONTENTS) != 0 + || ((output_section->flags & SEC_LOAD) != 0 + && (output_section->flags & SEC_THREAD_LOCAL)))) + break; + 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")); @@ -199,7 +209,7 @@ build_link_order (lang_statement_union_type *statement) link_order->size = bfd_get_reloc_size (rs->howto); link_order->u.reloc.p = (struct bfd_link_order_reloc *) - xmalloc (sizeof (struct bfd_link_order_reloc)); + xmalloc (sizeof (struct bfd_link_order_reloc)); link_order->u.reloc.p->reloc = rs->reloc; link_order->u.reloc.p->addend = rs->addend_value; @@ -229,40 +239,39 @@ build_link_order (lang_statement_union_type *statement) attached */ asection *i = statement->input_section.section; - if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag + if (i->sec_info_type != SEC_INFO_TYPE_JUST_SYMS && (i->flags & SEC_EXCLUDE) == 0) { asection *output_section = i->output_section; + struct bfd_link_order *link_order; ASSERT (output_section->owner == link_info.output_bfd); - if ((output_section->flags & SEC_HAS_CONTENTS) != 0 - || ((output_section->flags & SEC_LOAD) != 0 - && (output_section->flags & SEC_THREAD_LOCAL))) - { - struct bfd_link_order *link_order; + if (!((output_section->flags & SEC_HAS_CONTENTS) != 0 + || ((output_section->flags & SEC_LOAD) != 0 + && (output_section->flags & SEC_THREAD_LOCAL)))) + break; - link_order = bfd_new_link_order (link_info.output_bfd, - output_section); + link_order = bfd_new_link_order (link_info.output_bfd, + output_section); - if (i->flags & SEC_NEVER_LOAD) - { - /* We've got a never load section inside one which - is going to be output, we'll change it into a - fill. */ - link_order->type = bfd_data_link_order; - link_order->u.data.contents = (unsigned char *) ""; - link_order->u.data.size = 1; - } - else - { - link_order->type = bfd_indirect_link_order; - link_order->u.indirect.section = i; - ASSERT (i->output_section == output_section); - } - link_order->size = i->size; - link_order->offset = i->output_offset; + if ((i->flags & SEC_NEVER_LOAD) != 0 + && (i->flags & SEC_DEBUGGING) == 0) + { + /* We've got a never load section inside one which is + going to be output, we'll change it into a fill. */ + link_order->type = bfd_data_link_order; + link_order->u.data.contents = (unsigned char *) ""; + link_order->u.data.size = 1; + } + else + { + link_order->type = bfd_indirect_link_order; + link_order->u.indirect.section = i; + ASSERT (i->output_section == output_section); } + link_order->size = i->size; + link_order->offset = i->output_offset; } } break; @@ -276,18 +285,19 @@ build_link_order (lang_statement_union_type *statement) output_section = statement->padding_statement.output_section; ASSERT (statement->padding_statement.output_section->owner == link_info.output_bfd); - if ((output_section->flags & SEC_HAS_CONTENTS) != 0 - || ((output_section->flags & SEC_LOAD) != 0 - && (output_section->flags & SEC_THREAD_LOCAL))) - { - 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; - link_order->u.data.contents = statement->padding_statement.fill->data; - link_order->u.data.size = statement->padding_statement.fill->size; - } + + if (!((output_section->flags & SEC_HAS_CONTENTS) != 0 + || ((output_section->flags & SEC_LOAD) != 0 + && (output_section->flags & SEC_THREAD_LOCAL)))) + break; + + 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; + link_order->u.data.contents = statement->padding_statement.fill->data; + link_order->u.data.size = statement->padding_statement.fill->size; } break; @@ -326,7 +336,7 @@ clone_section (bfd *abfd, asection *s, const char *name, int *count) { char *tname; char *sname; - unsigned int len; + unsigned int len; asection *n; struct bfd_link_hash_entry *h; @@ -399,13 +409,9 @@ ds (asection *s) while (l) { if (l->type == bfd_indirect_link_order) - { - printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename); - } + printf ("%8x %s\n", l->offset, l->u.indirect.section->owner->filename); else - { - printf (_("%8x something else\n"), l->offset); - } + printf (_("%8x something else\n"), l->offset); l = l->next; } printf ("\n"); @@ -478,13 +484,13 @@ split_sections (bfd *abfd, struct bfd_link_info *info) || info->strip == strip_some) thislines = sec->lineno_count; - if (info->relocatable) + if (bfd_link_relocatable (info)) thisrelocs = sec->reloc_count; thissize = sec->size; } - else if (info->relocatable + else if (bfd_link_relocatable (info) && (p->type == bfd_section_reloc_link_order || p->type == bfd_symbol_reloc_link_order)) thisrelocs++; @@ -562,6 +568,7 @@ ldwrite (void) /* Reset error indicator, which can typically something like invalid format from opening up the .o files. */ bfd_set_error (bfd_error_no_error); + lang_clear_os_map (); lang_for_each_statement (build_link_order); if (config.split_by_reloc != (unsigned) -1