This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Strange KEEP behavior in linker script
Well, my issue is the fact that the output section is discarded.
I tried the --no-gc-sections but it has no effect.
I can stop the linker from discarding the section adding a contribution
like below, but that's ....strange ;-)
.mysec :
{
. += 1; /* dummy contribution */
mysec_start = .;
KEEP(*(.mysec));
mysec_end = .;
}
When there are no contributions, the section seems to be removed in
ldlang.c:
strip_excluded_output_sections (void)
{
...
exclude = (output_section->rawsize == 0
&& (output_section->flags & SEC_KEEP) == 0
&& !bfd_section_removed_from_list (output_bfd,
output_section));
...
if (exclude)
{
/* We don't set bfd_section to NULL since bfd_section of the
removed output section statement may still be used. */
if (!os->section_relative_symbol
&& !os->update_dot_tree)
os->ignored = TRUE;
output_section->flags |= SEC_EXCLUDE;
bfd_section_list_remove (output_bfd, output_section);
output_bfd->section_count--;
}
...
}
The SEC_KEEP flag is tested on the output section.
I see your point about the KEEP() semantic, but then do you see a
solution to avoid the discard of the output section (without adding
artificial contributions in the linker script)?
Daniel Jacobowitz wrote:
On Tue, May 06, 2008 at 03:29:27PM +0200, Denis FERRANTI wrote:
Shouldn't the KEEP() statement force the generation of the output section
in the ELF file, even if there are no input sections.
No, why should it? It is supposed to keep the input sections, not the
output section. I'm not sure why ld started discarding the empty
output section.
--
Denis Ferranti