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