SEC_NEVER_LOAD cleanup
Kai Tietz
ktietz70@googlemail.com
Fri Oct 15 20:36:00 GMT 2010
2010/10/15 Dave Korn <dave.korn.cygwin@gmail.com>:
>
> Hi Alan,
>
> On 16/09/2010 01:03, Alan Modra wrote:
>> This gets rid of SEC_NEVER_LOAD in ELF code, curing these failures:
>
>> I spent quite a lot of time going through changes related to
>> SEC_NEVER_LOAD. Testcases in various bug reports behave reasonably
>> after this patch, and I think the COFF support should work too but I'm
>> less sure of this since I don't have any reason to use COFF/ECOFF/PE
>> myself.
>
>> bfd/
>> * elf.c (bfd_elf_get_default_section_type): Don't test SEC_NEVER_LOAD.
>> * elflink.c (elf_link_input_bfd): Likewise.
>> ld/
>> * ld.texinfo (NOLOAD): Do not erroneously state that contents will
>> appear in output file.
>> * ldlang.c (lang_add_section): Clear SEC_HAS_CONTENTS on noload
>> unless SEC_COFF_SHARED_LIBRARY.
>> (map_input_to_output_sections): Don't set SEC_HAS_CONTENTS for noload
>> output sections.
>> (lang_size_sections_1): Don't test SEC_NEVER_LOAD when deciding
>> to update dot in region. Ditto when setting SEC_ALLOC if dot
>> advanced due to assignment.
>> * ldwrite.c (build_link_order): Don't test SEC_NEVER_LOAD.
>
> This patch causes a failure building the cygwin dll:
>
>> GNU ld (GNU Binutils) 2.20.51.20100916
>> Creating library file: cygdll.a
>> /gnu/binutils/git.repo/obj/ld/.libs/ld-new: BFD (GNU Binutils) 2.20.51.20100916
>> assertion fail /gnu/binutils/git.repo/binutils/bfd/linker.c:2678
>> /gnu/binutils/git.repo/obj/ld/.libs/ld-new: final link failed: Section has no contents
>
> Which appears to be from here:
>
>> static bfd_boolean
>> default_data_link_order (bfd *abfd,
>> struct bfd_link_info *info ATTRIBUTE_UNUSED,
>> asection *sec,
>> struct bfd_link_order *link_order)
>> {
>> bfd_size_type size;
>> size_t fill_size;
>> bfd_byte *fill;
>> file_ptr loc;
>> bfd_boolean result;
>>
>> BFD_ASSERT ((sec->flags & SEC_HAS_CONTENTS) != 0);
>
> That's triggered by the ".gnu_debuglink_overlay" section. It has flags =
> 512 - SEC_NEVER_LOAD is set and nothing else. It's getting added to the link
> via a bit of custom linker script in the cygwin dll build system that looks
> like so:
>
>> .gnu_debuglink_overlay ALIGN(__section_alignment__) (NOLOAD):
>> {
>> BYTE(0) /* c */
>> BYTE(0) /* y */
>> BYTE(0) /* g */
>> BYTE(0) /* w */
>> BYTE(0) /* i */
>> BYTE(0) /* n */
>> BYTE(0) /* 1 */
>> BYTE(0) /* . */
>> BYTE(0) /* d */
>> BYTE(0) /* b */
>> BYTE(0) /* g */
>> BYTE(0) /* \0 */
>> LONG(0) /* checksum */
>> }
>
> I think (haven't checked yet) that this looks like a consequence of the
> ldlang.c changes. Any thoughts on how to fix it?
>
> cheers,
> DaveK
>
>
Well, you can add this section to the comparison for debugging section
in bfd's coffcode.h (like done there for the others - .debug*,
comment, etc). Should work then.
Cheers,
Kai
--
| (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination
More information about the Binutils
mailing list