Precisamos de bibliotecas c ao executar um programa?

0

O arquivo executável deve estar no código da máquina.

Assim, fará chamadas de sistema sem a necessidade de bibliotecas c.

Masnãoconsigodescobriroqueessaimagemsignifica?

É apenas um método de abstração?

    
por Ahmed Elsawy 07.11.2017 / 00:37

1 resposta

6

Você tem um programa que chama uma função de biblioteca. Neste caso, é a biblioteca padrão do sistema, também chamada de “biblioteca C” (mas existem muitas outras bibliotecas que podem ser chamadas a partir do código C, isto é apenas um nome). “Função de biblioteca” significa que o código da função é distribuído como parte de uma biblioteca . Existem duas maneiras em que o programa pode invocar a função de biblioteca quando é executado.

Se a biblioteca estiver vinculada estaticamente ao programa, isso significa que, quando o programa é compilado, o resultado é um arquivo executável que inclui o resultado da compilação do código-fonte do programa (a função main e qualquer outra função no programa) e as funções da biblioteca, como printf (que o vinculador encontra em um arquivo chamado /lib/libc.a ou algum local similar¹). Isso significa que a etapa "Linker" é totalmente executada quando o programa é construído. Todos os bits “(Lib ref)” são substituídos pelo código da biblioteca. Quando o programa é executado, ele não precisa de nenhum arquivo de biblioteca. O código de printf está no executável do programa. Como write é uma chamada de sistema e não uma função de biblioteca², seu código está dentro do kernel.

Se a biblioteca for vinculada dinamicamente , a etapa de vinculação na imagem não incluirá o código da biblioteca no executável. Tudo o que ele faz é preencher algumas instruções para carregar certas funções da biblioteca quando o programa é iniciado: o executável ainda contém os bits “(Lib ref)”. Quando o arquivo executável é executado, uma das primeiras coisas que ele faz é carregar o arquivo de biblioteca compartilhada ( /lib/libc.so ou algo assim¹) e combinar os nomes de função requeridos pelo programa com os nomes de função oferecidos pela biblioteca.

O termo "método de abstração" é bastante vago. Não se fixe nele. Você poderia dizer que a vinculação dinâmica abstrai a biblioteca, já que o mesmo executável pode ser executado com diferentes implementações da biblioteca.

O diagrama parece estar explicando a vinculação estática. Na vida real, a vinculação dinâmica é mais comum em sistemas de multiprogramação. A vinculação estática tem duas desvantagens principais: você não pode atualizar a biblioteca (por exemplo, para corrigir um bug) sem atualizar todos os programas que a usam e, se muitos programas usarem a mesma biblioteca, você precisará armazenar tantas cópias do código. A ligação estática é adequada para um sistema embarcado de baixo custo que executa somente um único programa e só pode ser atualizado substituindo toda a imagem de código, mas a vinculação dinâmica é a norma para sistemas que executam muitos programas diferentes.

¹ Os nomes dos arquivos são provavelmente mais complexos do que no seu sistema, mas isso não é relevante para esta resposta.
² Na verdade, há uma função de biblioteca chamada write , mas tudo o que ela faz é fazer a chamada do sistema. Na minha resposta estou me referindo à chamada do sistema por esse nome.

    
por 07.11.2017 / 01:26