Especificar a libc local chama global libc?

2

Se eu executar o comando foo especificando uma libc diferente para usar da seguinte forma:

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC foo

A libc globalmente definida é usada para executar qualquer comando acima?

Por questão de contexto: considere a situação em que sua libc está fisicamente presente e acessível em sua máquina, mas não pode ser usada por algum motivo. Dado um shell logado, para executar um comando específico, você precisaria fornecer uma libc diferente.

Especificar o LD_LIBRARY_PATH inline, iria defini-lo para o local de uma libc funcional sem necessidade aparente de chamar o definido globalmente.

A libc globalmente definida seria chamada da mesma forma para definir localmente a nova variável de ambiente?

    
por user213575 02.09.2015 / 20:31

2 respostas

1

Não. A ligação dinâmica não faz parte da libc no sentido de /lib/libc.so.6 , é a funcionalidade do /lib/ld.so (ambos têm um nome de arquivo e caminho um pouco alterados nos últimos anos, mas a essência é a mesma ).

Sim, ld.so , o vinculador dinâmico também é uma biblioteca compartilhada. Carregá-lo é a primeira coisa que a maioria dos linux binários faz, ainda antes de chamar sua função main() .

Embora ld.so seja um arquivo diferente da libc, ele também faz parte da distribuição gnu libc em suas formas binária de origem e compilada.

Vincular no ld.so é proveniente de um pedaço de código codificado, dado pelo gcc para cada binário ELF do linux. Seu caminho também é codificado no binário. Você não pode mudar isso facilmente, embora seja possível se for necessário.

Se você substituir libc.so.6 por uma configuração LD_LIBRARY_PATH alternativa, essa biblioteca substituirá a libc orderntly pela sua própria, mas ela ainda será carregada pelo ld.so normal.

Assim, a resposta à sua pergunta é "sim, mas ...".

    
por 02.09.2015 / 21:52
1

Quando você executa o comando fornecido na pergunta:

LD_LIBRARY_PATH=$PATH_TO_MY_CUSTOM_LIBC bash -c 'foo'
  • O bash executado usa a libc fornecida no caminho $PATH_TO_MY_CUSTOM_LIBC se houver um lá. É o vinculador / carregador que honra essa variável de ambiente.
  • O comando que é executado dentro daquele bash (você chamou de foo ) usará a libc que pode ser encontrada regularmente em seu sistema pelo vinculador / carregador que por sua vez consulta /etc/ld.so.cache .
por 02.09.2015 / 20:51