Build spends a long time in "mkimport".

Jon Turney jon.turney@dronecode.org.uk
Sun Oct 11 17:14:29 GMT 2020


On 11/10/2020 08:24, Mark Geisert wrote:
> Kaz Kylheku (Cygwin) via Cygwin wrote:
>> Hi All,
>>
>> When building the Cygwin DLL, this single step takes almost ten minutes:
>>
>>    ../../.././winsup/cygwin/mkimport --cpu=i686 --ar=ar --as=as 
>> --nm=nm --objcopy=objcopy \
>>    --replace=atexit= --replace=timezone= --replace=uname=uname_x 
>> --replace=__xdrrec_getrec=
>>
>>    [ .. SNIP ... ]
>>
>>    --replace=truncate=_truncate64 libcygwin.a cygdll.a 
>> _cygwin_crt0_common.o \
>>    atexit.o cygwin_attach_dll.o cygwin_crt0.o dll_entry.o dll_main.o 
>> dso_handle.o \
>>    libcmain.o premain0.o premain1.o premain2.o premain3.o 
>> pseudo-reloc-dummy.o
>>
>> What's puzzling is that there is very CPU activity during this time. 
>> It's launching
>> some objcopy commands.
>>
>> Is there some documentation that provides an overview of what exactly 
>> this does,
>> other than studying its perl source code?

I'm afraid not.

>> Maybe it can be sped up?

Almost certainly and yes please :)

>> I'm going to have to cycle quite a few times on some changes, so this 
>> is frustrating.
> 
> Hi Kaz,
> I'm redirecting this to the cygwin-developers list as it's a Cygwin 
> build issue. Please follow up there.
> 
> I've looked at .../winsup/cygwin/mkimport for the same reason as you -- 
> it takes forever on my Windows machines.  But I don't know enough perl 
> to make any changes.
> 
> Near the end of mkimport there's a loop over all the "--replace" args, 
> essentially.  For each one there are two system() calls launching two 

I think this perhaps is looping over all the exported symbols.

> objcopy processes to do something.  This is much slower on Cygwin than 
> it would be cross-building from Linux, for example.

What I think mkimport is doing:  This produces the import library for 
the Cygwin DLL, which is actually a 'hybrid' library.  Mainly it 
consists of import stubs for functions in the DLL (some of which are 
renamed by --replace options), but it also contains some specific object 
files directly (this is stuff called by crt0.o, but idk why it's can't 
be in the DLL).

If it's actually the objcopy which is slow, then it would be nice to 
understand why, although they could also be parallelized.


More information about the Cygwin-developers mailing list