From 2b42b063f3a3b0268d5ac52d3fe09dd3b8964924 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 21 Oct 2010 23:28:06 +0000 Subject: [PATCH] * ldwrite.c (build_link_order ): Don't output when section has no contents. (build_link_order ): Likewise. --- ld/ChangeLog | 18 +++++++---- ld/ldwrite.c | 86 +++++++++++++++++++++++++++++----------------------- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 5f7885b89c2..09a1f719403 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2010-10-22 Alan Modra + + * ldwrite.c (build_link_order ): Don't + output when section has no contents. + (build_link_order ): Likewise. + 2010-10-21 Joseph Myers * emulparams/elf32_tic6x_le.sh (ATTRS_SECTIONS): Use @@ -26,7 +32,7 @@ (add_input_library): Likewise. (set_extra_library_path): Likewise. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 6/6). * ldlang.c (load_symbols): Handle bfd subsitution when calling the @@ -35,13 +41,13 @@ member to the plugins and if claimed set "subsbfd" output parameter to point to the dummy IR-only BFD. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 5/6). * plugin.c (asymbol_from_plugin_symbol): If the bfd is an ELF bfd, find the elf symbol data and set the visibility in the st_other field. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 4/6). * ldlang.c (lang_process)[ENABLE_PLUGINS]: Move invocation of @@ -69,7 +75,7 @@ (onall_symbols_read): Iterate the list of new files, libs and dirs, adding them. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 3/6). * ldmain.c (notice)[ENABLE_PLUGINS]: Call plugin_notice. @@ -89,7 +95,7 @@ (parse_options): Accept "dumpresolutions". (onall_symbols_read): Get syms and dump resolutions if it was given. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 2/6). * ldfile.c (ldfile_try_open_bfd)[ENABLE_PLUGINS]: Don't return early @@ -132,7 +138,7 @@ (onall_symbols_read): Make static and use TV_MESSAGE. (oncleanup): Likewise. -2010-10-14 Dave Korn +2010-10-14 Dave Korn Apply LD plugin patch series (part 1/6). * configure.in: Add AC_CHECKs for file io and dlfcn headers and diff --git a/ld/ldwrite.c b/ld/ldwrite.c index d0616fcbd99..b7a1469c06a 100644 --- a/ld/ldwrite.c +++ b/ld/ldwrite.c @@ -1,6 +1,7 @@ /* 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. + 2003, 2004, 2005, 2006, 2007, 2008, 2010 + Free Software Foundation, Inc. Written by Steve Chamberlain sac@cygnus.com This file is part of the GNU Binutils. @@ -51,6 +52,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")); @@ -191,6 +197,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")); @@ -233,37 +244,35 @@ build_link_order (lang_statement_union_type *statement) && (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) != 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; + 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; @@ -277,18 +286,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; -- 2.30.2