X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ld%2Fldwrite.c;h=43bc40b7b1ccc0f2b61f0de11f20ebbc793bdbd9;hb=51a0e41ca956e6bdf072aea6a7e15c4e7269c2d0;hp=6b8423b568317a22b3d4aebc0fe72deb3b6d129d;hpb=2e76e85a380390ce45e72a41822d29985261a529;p=platform%2Fupstream%2Fbinutils.git diff --git a/ld/ldwrite.c b/ld/ldwrite.c index 6b8423b..43bc40b 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-2014 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")); @@ -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")); @@ -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; @@ -562,6 +572,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