Apply commit f6c8fecc6fe3d5532691867a7f27820bb1c426a9 from upstream
(still under GPLv2 at that time): Author: H.J. Lu <hjl@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
This commit is contained in:
parent
6582686305
commit
b985ffce13
@ -4787,12 +4787,13 @@ assign_file_positions_except_relocs (bfd *abfd,
|
||||
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);
|
||||
|
@ -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)
|
||||
|
@ -155,7 +155,10 @@ typedef struct lang_output_section_statement_struct
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user