[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnulib-bug
Subject:    Re: crc.c clashes with zlib
From:       Gisle Vanem <gisle.vanem () gmail ! com>
Date:       2020-04-14 10:50:54
Message-ID: 4c17bd52-f94f-a490-0193-5a44098e1b34 () gmail ! com
[Download RAW message or body]

Bruno Haible wrote:

>> I have a situation with clang's 'lld-link' linker
>> in Wget2 where the symbol 'crc32()' in Gnulib is called
>> instead of the correct symbol 'crc32()' in Zlib.
> 
> Are you sure the symbol that is called comes from gnulib?
> The only references to 'crc32' in gnulib are in the module 'crc',
> and this module is not used by any other module in gnulib nor by
> by wget2 [1].

Hello Bruno. Sorry for the delay, but Google moved
your reply to the Spam-folder!?

First, I admit I did build and use Gnulib in an
non-official way; a static-lib of *all* Gnulib functions:
   nm --defined-only gnulib-vc.lib | grep ' T _crc32'
   00000000 T _crc32
   00000040 T _crc32_no_xor
   00000020 T _crc32_update
   00000060 T _crc32_update_no_xor

But the issue I had while building Wget2 (with '-DWITH_ZLIB');
when compiling using 'clang-cl' and linking with
MSVC's 'link', there is no problem with any .lib order.
 From the wget2.map:
    0001:000dfcb0   _crc32    004e0cb0 f   zlib:crc32.obj

But using 'lld-link' instead, and with 'gnulib-vc.lib'
ahead of 'zlib.lib', the wget2.map has this:
   lld-link: Loaded zlib.lib(crc32.obj) for _crc32
   ...
   lld-link: Loaded gnulib-vc.lib(crc.obj) for _crc32

Wget2 will use the latter '_crc32' and crash at run-time:
   wget2!crc32_update_no_xor(unsigned int crc = 0xffffffff,
    char * buf = 0x00000000 "", unsigned int len = 0xd7bcd10)+0x24

   wget2!crc32_update(unsigned int crc = 0, char * buf = 0x00000000 "",
     unsigned int len = 0xd7bcd10)+0x17

   wget2!crc32(char * buf = 0x00000000 "", unsigned int len = 0xd7bcd10)+0x12
   wget2!inflate(struct z_stream_s * strm = 0x0d2dd530, int flush = 0n2)+0x111
    wget2!gzip_decompress(struct wget_decompressor_st * dc = <Value unavailable error>,
    char * src = <Value unavailable error>, unsigned int srclen = <Value unavailable error>)+0x42


But linking with 'zlib.lib' first, there is no problem.

Hence my request to rename those symbols to 'gl_crc32' etc.


> Can you show what the machine code of the called function looks like?

Dis-asm of Zlib's crc32.obj:
_crc32:
         push            ebp
         mov             ebp,esp
         push            ecx
         mov             dword ptr -0x4[ebp],0xcccccccc
         cmp             dword ptr 0xc[ebp],0x00000000
         jne             X$1
         xor             eax,eax
         jmp             X$8
X$1:
         mov             eax,0x00000001
         test            eax,eax
         je              X$3
         mov             dword ptr -0x4[ebp],0x00000001
         movzx           ecx,byte ptr -0x4[ebp]
         ....

Dis-asm of Gnulib's crc.obj is something else:
_crc32:
         push            ebp
         mov             ebp,esp
         mov             eax,0xc[ebp]
         push            eax
         mov             ecx,0x8[ebp]
         push            ecx
         push            0x00000000
         call            _crc32_update
         add             esp,0x0000000c
         pop             ebp
         ret

-- 
--gv

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic