[llvm-dev] LLD: targeting cygwin
Rui Ueyama via llvm-dev
llvm-dev at lists.llvm.org
Thu Feb 8 20:26:41 PST 2018
Is that the only problem to use lld to link cygwin programs?
On Thu, Feb 8, 2018 at 8:19 AM, Andrew Kelley <superjoe30 at gmail.com> wrote:
> Here are the linker errors:
>
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __data_start__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __data_end__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __bss_start__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __bss_end__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __RUNTIME_PSEUDO_RELOC_LIST__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __RUNTIME_PSEUDO_RELOC_LIST_END__
> lld: warning: libcygwin.a(_cygwin_crt0_common.o): undefined symbol:
> __image_base__
>
>
> They seem to come from the default cygwin ld linker script, pasted below:
>
> GNU ld (GNU Binutils) 2.29.1.20171006
> Supported emulations:
> i386pep
> i386pe
> using internal linker script:
> ==================================================
> /* Default linker script, for normal executables */
> /* Copyright (C) 2014-2017 Free Software Foundation, Inc.
> Copying and distribution of this script, with or without modification,
> are permitted in any medium without royalty provided the copyright
> notice and this notice are preserved. */
> OUTPUT_FORMAT(pei-x86-64)
> SEARCH_DIR("/usr/x86_64-pc-cygwin/lib"); SEARCH_DIR("/usr/lib");
> SEARCH_DIR("/usr/lib/w32api");
> SECTIONS
> {
> /* Make the virtual address and file offset synced if the alignment is
> lower than the target page size. */
> . = SIZEOF_HEADERS;
> . = ALIGN(__section_alignment__);
> .text __image_base__ + ( __section_alignment__ < 0x1000 ? . :
> __section_alignment__ ) :
> {
> KEEP(*(.init))
> *(.text)
> *(SORT(.text$*))
> *(.text.*)
> *(.gnu.linkonce.t.*)
> *(.glue_7t)
> *(.glue_7)
> . = ALIGN(8);
> ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
> LONG (-1); LONG (-1);
> KEEP (*(.ctors));
> KEEP (*(.ctor));
> KEEP (*(SORT(.ctors.*)));
> LONG (0); LONG (0);
> ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
> LONG (-1); LONG (-1);
> KEEP (*(.dtors));
> KEEP (*(.dtor));
> KEEP (*(SORT(.dtors.*)));
> LONG (0); LONG (0);
> KEEP (*(.fini))
> /* ??? Why is .gcc_exc here? */
> *(.gcc_exc)
> PROVIDE (etext = .);
> KEEP (*(.gcc_except_table))
> }
> /* The Cygwin32 library uses a section to avoid copying certain data
> on fork. This used to be named ".data". The linker used
> to include this between __data_start__ and __data_end__, but that
> breaks building the cygwin32 dll. Instead, we name the section
> ".data_cygwin_nocopy" and explicitly include it after __data_end__. */
> .data BLOCK(__section_alignment__) :
> {
> __data_start__ = . ;
> *(.data)
> *(.data2)
> *(SORT(.data$*))
> KEEP(*(.jcr))
> __data_end__ = . ;
> *(.data_cygwin_nocopy)
> }
> .rdata BLOCK(__section_alignment__) :
> {
> *(.rdata)
> *(SORT(.rdata$*))
> __rt_psrelocs_start = .;
> KEEP(*(.rdata_runtime_pseudo_reloc))
> __rt_psrelocs_end = .;
> }
> __rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start;
> ___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
> __RUNTIME_PSEUDO_RELOC_LIST_END__ = .;
> ___RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;
> __RUNTIME_PSEUDO_RELOC_LIST__ = . - __rt_psrelocs_size;
> .eh_frame BLOCK(__section_alignment__) :
> {
> KEEP (*(.eh_frame*))
> }
> .pdata BLOCK(__section_alignment__) :
> {
> KEEP(*(.pdata*))
> }
> .xdata BLOCK(__section_alignment__) :
> {
> KEEP(*(.xdata*))
> }
> .bss BLOCK(__section_alignment__) :
> {
> __bss_start__ = . ;
> *(.bss)
> *(COMMON)
> __bss_end__ = . ;
> }
> .edata BLOCK(__section_alignment__) :
> {
> *(.edata)
> }
> /DISCARD/ :
> {
> *(.debug$S)
> *(.debug$T)
> *(.debug$F)
> *(.drectve)
> *(.note.GNU-stack)
> *(.gnu.lto_*)
> }
> .idata BLOCK(__section_alignment__) :
> {
> /* This cannot currently be handled with grouped sections.
> See pep.em:sort_sections. */
> KEEP (SORT(*)(.idata$2))
> KEEP (SORT(*)(.idata$3))
> /* These zeroes mark the end of the import list. */
> LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
> KEEP (SORT(*)(.idata$4))
> __IAT_start__ = .;
> SORT(*)(.idata$5)
> __IAT_end__ = .;
> KEEP (SORT(*)(.idata$6))
> KEEP (SORT(*)(.idata$7))
> }
> .CRT BLOCK(__section_alignment__) :
> {
> ___crt_xc_start__ = . ;
> KEEP (*(SORT(.CRT$XC*))) /* C initialization */
> ___crt_xc_end__ = . ;
> ___crt_xi_start__ = . ;
> KEEP (*(SORT(.CRT$XI*))) /* C++ initialization */
> ___crt_xi_end__ = . ;
> ___crt_xl_start__ = . ;
> KEEP (*(SORT(.CRT$XL*))) /* TLS callbacks */
> /* ___crt_xl_end__ is defined in the TLS Directory support code */
> ___crt_xp_start__ = . ;
> KEEP (*(SORT(.CRT$XP*))) /* Pre-termination */
> ___crt_xp_end__ = . ;
> ___crt_xt_start__ = . ;
> KEEP (*(SORT(.CRT$XT*))) /* Termination */
> ___crt_xt_end__ = . ;
> }
> /* Windows TLS expects .tls$AAA to be at the start and .tls$ZZZ to be
> at the end of the .tls section. This is important because _tls_start
> MUST
> be at the beginning of the section to enable SECREL32 relocations
> with TLS
> data. */
> .tls BLOCK(__section_alignment__) :
> {
> ___tls_start__ = . ;
> KEEP (*(.tls$AAA))
> KEEP (*(.tls))
> KEEP (*(.tls$))
> KEEP (*(SORT(.tls$*)))
> KEEP (*(.tls$ZZZ))
> ___tls_end__ = . ;
> }
> .endjunk BLOCK(__section_alignment__) :
> {
> /* end is deprecated, don't use it */
> PROVIDE (end = .);
> PROVIDE ( _end = .);
> __end__ = .;
> }
> .rsrc BLOCK(__section_alignment__) : SUBALIGN(4)
> {
> KEEP (*(.rsrc))
> KEEP (*(.rsrc$*))
> }
> .reloc BLOCK(__section_alignment__) :
> {
> *(.reloc)
> }
> .stab BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.stab)
> }
> .stabstr BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.stabstr)
> }
> /* DWARF debug sections.
> Symbols in the DWARF debugging sections are relative to the beginning
> of the section. Unlike other targets that fake this by putting the
> section VMA at 0, the PE format will not allow it. */
> /* DWARF 1.1 and DWARF 2. */
> .debug_aranges BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_aranges)
> }
> .zdebug_aranges BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_aranges)
> }
> .debug_pubnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_pubnames)
> }
> .zdebug_pubnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_pubnames)
> }
> .debug_pubtypes BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_pubtypes)
> }
> .zdebug_pubtypes BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_pubtypes)
> }
> /* DWARF 2. */
> .debug_info BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_info .gnu.linkonce.wi.*)
> }
> .zdebug_info BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_info .zdebug.gnu.linkonce.wi.*)
> }
> .debug_abbrev BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_abbrev)
> }
> .zdebug_abbrev BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_abbrev)
> }
> .debug_line BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_line)
> }
> .zdebug_line BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_line)
> }
> .debug_frame BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_frame)
> }
> .zdebug_frame BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_frame)
> }
> .debug_str BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_str)
> }
> .zdebug_str BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_str)
> }
> .debug_loc BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_loc)
> }
> .zdebug_loc BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_loc)
> }
> .debug_macinfo BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_macinfo)
> }
> .zdebug_macinfo BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_macinfo)
> }
> /* SGI/MIPS DWARF 2 extensions. */
> .debug_weaknames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_weaknames)
> }
> .zdebug_weaknames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_weaknames)
> }
> .debug_funcnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_funcnames)
> }
> .zdebug_funcnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_funcnames)
> }
> .debug_typenames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_typenames)
> }
> .zdebug_typenames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_typenames)
> }
> .debug_varnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_varnames)
> }
> .zdebug_varnames BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_varnames)
> }
> .debug_macro BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_macro)
> }
> .zdebug_macro BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_macro)
> }
> /* DWARF 3. */
> .debug_ranges BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_ranges)
> }
> .zdebug_ranges BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_ranges)
> }
> /* DWARF 4. */
> .debug_types BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_types .gnu.linkonce.wt.*)
> }
> .zdebug_types BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_types .zdebug.gnu.linkonce.wt.*)
> }
> /* For Go and Rust. */
> .debug_gdb_scripts BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.debug_gdb_scripts)
> }
> .zdebug_gdb_scripts BLOCK(__section_alignment__) (NOLOAD) :
> {
> *(.zdebug_gdb_scripts)
> }
> }
>
> On Wed, Feb 7, 2018 at 6:24 PM, Rui Ueyama <ruiu at google.com> wrote:
>
>> COFF lld doesn't support the linker script at the moment, and I'm sad to
>> say that it is very unlikely to support that in the future. Linker script
>> support is so huge that I can't imagine we really want it for COFF. GNU BFD
>> linker supports it because the linker is built as an interpreter for the
>> built-in linker script (and that's one of the reasons why GNU linker is by
>> far more complicated than lld), but that's not the case for lld.
>>
>> So, "support linker script" is a huge feature request that we are very
>> unlikely to fulfill. But I don't think that you actually need all the
>> features of the linker script. If you have some specific need, please
>> explain. We may be able to help.
>>
>> On Wed, Feb 7, 2018 at 3:10 PM, Andrew Kelley via llvm-dev <
>> llvm-dev at lists.llvm.org> wrote:
>>
>>> Hello, I have a user who is trying to get LLD to link for the cygwin
>>> target: https://github.com/zig-lang/zig/issues/751
>>>
>>> Currently the issue they are running into is needing to define a linker
>>> script, but the COFF driver (or MinGW driver) does not have support for
>>> that.
>>>
>>> Is there documentation or advice for how to use LLD to link for cygwin?
>>> As a starting point, which driver to use?
>>>
>>> Regards,
>>> Andrew
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180208/fd741d8c/attachment.html>
More information about the llvm-dev
mailing list