Por que devo colocar o nome do arquivo de origem antes dos nomes das bibliotecas na linha de comando do compilador?

0

Como usuário do OpenSUSE, estou acostumado a digitar:

gcc -lz myfile.c

Fiquei surpreso que no Ubuntu esse comando falharia com algo como:

myfile.c:(.text+0x5): undefined reference to 'zlibVersion'
collect2: error: ld returned 1 exit status

Com gcc -v descobri que o comando collect2 gerado pelo compilador C do GCC no Ubuntu começa com --as-needed enquanto no OpenSUSE essa opção não está lá. Ou seja a linha de comando no Ubuntu se parece com:

/usr/lib/gcc/x86_64-linux-gnu/5/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cc7kz9Nz.o ....[yet more stuff removed].....\
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

Enquanto no OpenSUSE parece bastante semelhante, mas para a opção --as-needed .

/usr/lib64/gcc/x86_64-suse-linux/4.8/collect2 --build-id --eh-frame-hdr\
-m elf_x86_64 -dynamic-linker \
....[a lot of stuff removed].....\
-lz /tmp/cccpZlmL.o ....[yet more stuff removed].....\
/usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../lib64/crtn.o

De onde veio essa diferença? Tem sido discutido em algum lugar? Devo nunca colocar nomes de bibliotecas antes do nome do arquivo de origem?

    
por Dmitri Chubarov 15.03.2018 / 12:32

1 resposta

3

Isso está documentado no wiki do Ubuntu . É definido por padrão para reduzir o número de dependências nos pacotes, mas como você descobriu isso significa que a ordem das bibliotecas é significativa: você precisa garantir que os objetos (de qualquer tipo) apareçam antes das bibliotecas que eles usam .

Você pode desativar isso com --no-as-needed .

    
por 15.03.2018 / 12:38