Por que alguns símbolos libc possuem encadernação WEAK e outros GLOBAL?

1

Por que símbolos diferentes na libc são declarados com ligações diferentes,

1510 0x0003d200 0xf7d55200   WEAK   FUNC   55 system
 454 0x00067b40 0xf7d7fb40   WEAK   FUNC  474 puts
 147 0x000303d0 0xf7d483d0 GLOBAL   FUNC   33 exit

De readelf -s /lib/i386-linux-gnu/libc-2.27.so ,

1510: 0003d200    55 FUNC    WEAK   DEFAULT   13 system@@GLIBC_2.0
 454: 00067b40   474 FUNC    WEAK   DEFAULT   13 puts@@GLIBC_2.0
 147: 000303d0    33 FUNC    GLOBAL DEFAULT   13 exit@@GLIBC_2.0

Desta questão , parece que a libc dos autores tem um LOCAL exit?

Qual é a rima ou razão por trás dos diferentes níveis de ligação da libc?

    
por Evan Carroll 31.10.2018 / 03:46

2 respostas

2

Símbolos fracos na glibc permitem a substituição, mesmo sob vinculação estática.

A saída global é um símbolo strong. Definições adicionais não serão resolvidas e aumentarão os erros de vinculação.

Assim, você pode ser capaz de fornecer seu próprio puts e, exceto uma segunda definição de puts que seja strong, o puts com a maior ocupação de memória (tamanho) será escolhido.

Por que o maior tamanho? Bem, o GCC precisa de algum discriminador, e a maior parte do glibc é estruturada de tal forma que os símbolos públicos são quase universalmente aliados a símbolos privados, o que significa que o tamanho é pequeno (um salto). Isso significa que, se você fornecer sua própria implementação de puts , a menos que você a estruture para alias exatamente da mesma maneira, as probabilidades são de que a implementação seja maior. Para puts , o alias direciona para __IO_puts .

Este é o mecanismo pelo qual a biblioteca padrão fornece implementações de chamadas de biblioteca padrão e permite que você as sobrescreva.

    
por 31.10.2018 / 05:01
0

A resposta para a pergunta de o que está acontecendo do ponto de vista técnico é que é uma implementação detalhe pelos motivos mencionados por Edwin (aliasing de símbolos) . Mas, além disso, porque é que é isso que acontece e que seria adequado para um patch.

15:14 < azanella> EvanCarroll, it is an implementation detail, exit is not used internally so there is no need to define an internal symbol with a alias to it [...] system and puts are both implemented by different symbols with alias to them [...] but it is a good question though, I believe for exit case it glibc is not really static linking focused and no one has raised any issue on trying to override it in static linking

De #glibc em irc.freenode.net em 31 de outubro de 2018

    
por 31.10.2018 / 22:21