svn commit: r214355 - in projects/binutils-2.17/contrib/binutils:
bfd ld
Dimitry Andric
dim at FreeBSD.org
Mon Oct 25 19:43:22 UTC 2010
Author: dim
Date: Mon Oct 25 19:43:22 2010
New Revision: 214355
URL: http://svn.freebsd.org/changeset/base/214355
Log:
Apply commit f6c8fecc6fe3d5532691867a7f27820bb1c426a9 from upstream
(still under GPLv2 at that time):
Author: H.J. Lu <hjl at lucon.org>
Date: Wed Sep 27 04:18:16 2006 +0000
PR ld/3223
PR ld/3267
* bfd/elf.c (assign_file_positions_for_non_load_sections): Don't warn
zero size allocated sections.
* ld/ldlang.h (lang_output_section_statement_type): Add
section_relative_symbol.
* ld/ldlang.c (strip_excluded_output_sections): Don't strip a section
with a symbol relative to it.
(lang_size_sections_1): Mark if an output section has a symbol symbol
relative to it.
This prevents warnings like the following during stripping of debug info
from kernel modules on i386:
===> zlib (all)
...
objcopy --only-keep-debug zlib.ko.debug zlib.ko.symbols
objcopy --strip-debug --add-gnu-debuglink=zlib.ko.symbols zlib.ko.debug zlib.ko
BFD: zlib.ko: warning: allocated section `.plt' not in segment
BFD: zlib.ko: warning: allocated section `.got' not in segment
Modified:
projects/binutils-2.17/contrib/binutils/bfd/elf.c
projects/binutils-2.17/contrib/binutils/ld/ldlang.c
projects/binutils-2.17/contrib/binutils/ld/ldlang.h
Modified: projects/binutils-2.17/contrib/binutils/bfd/elf.c
==============================================================================
--- projects/binutils-2.17/contrib/binutils/bfd/elf.c Mon Oct 25 19:33:45 2010 (r214354)
+++ projects/binutils-2.17/contrib/binutils/bfd/elf.c Mon Oct 25 19:43:22 2010 (r214355)
@@ -4787,12 +4787,13 @@ assign_file_positions_except_relocs (bfd
hdr->sh_offset = hdr->bfd_section->filepos;
else if ((hdr->sh_flags & SHF_ALLOC) != 0)
{
- ((*_bfd_error_handler)
- (_("%B: warning: allocated section `%s' not in segment"),
- abfd,
- (hdr->bfd_section == NULL
- ? "*unknown*"
- : hdr->bfd_section->name)));
+ if (hdr->sh_size != 0)
+ ((*_bfd_error_handler)
+ (_("%B: warning: allocated section `%s' not in segment"),
+ abfd,
+ (hdr->bfd_section == NULL
+ ? "*unknown*"
+ : hdr->bfd_section->name)));
if ((abfd->flags & D_PAGED) != 0)
off += vma_page_aligned_bias (hdr->sh_addr, off,
bed->maxpagesize);
Modified: projects/binutils-2.17/contrib/binutils/ld/ldlang.c
==============================================================================
--- projects/binutils-2.17/contrib/binutils/ld/ldlang.c Mon Oct 25 19:33:45 2010 (r214354)
+++ projects/binutils-2.17/contrib/binutils/ld/ldlang.c Mon Oct 25 19:43:22 2010 (r214355)
@@ -3244,6 +3244,7 @@ strip_excluded_output_sections (void)
continue;
exclude = (output_section->rawsize == 0
+ && !os->section_relative_symbol
&& (output_section->flags & SEC_KEEP) == 0
&& !bfd_section_removed_from_list (output_bfd,
output_section));
@@ -4442,11 +4443,19 @@ lang_size_sections_1
case lang_assignment_statement_enum:
{
bfd_vma newdot = dot;
+ etree_type *tree = s->assignment_statement.exp;
- exp_fold_tree (s->assignment_statement.exp,
+ exp_fold_tree (tree,
output_section_statement->bfd_section,
&newdot);
+ /* This symbol is relative to this section. */
+ if ((tree->type.node_class == etree_provided
+ || tree->type.node_class == etree_assign)
+ && (tree->assign.dst [0] != '.'
+ || tree->assign.dst [1] != '\0'))
+ output_section_statement->section_relative_symbol = 1;
+
if (!output_section_statement->ignored)
{
if (output_section_statement == abs_output_section)
Modified: projects/binutils-2.17/contrib/binutils/ld/ldlang.h
==============================================================================
--- projects/binutils-2.17/contrib/binutils/ld/ldlang.h Mon Oct 25 19:33:45 2010 (r214354)
+++ projects/binutils-2.17/contrib/binutils/ld/ldlang.h Mon Oct 25 19:43:22 2010 (r214355)
@@ -155,7 +155,10 @@ typedef struct lang_output_section_state
enum section_type sectype;
unsigned int processed : 1;
unsigned int all_input_readonly : 1;
+ /* If this section should be ignored. */
unsigned int ignored : 1;
+ /* If there is a symbol relative to this section. */
+ unsigned int section_relative_symbol : 1;
} lang_output_section_statement_type;
typedef struct
More information about the svn-src-projects
mailing list