Criando uma biblioteca compartilhada

Esta seção descreve como criar uma biblioteca compartilhada.

Tarefas pré-requisito

  1. Crie um ou mais arquivos de origem que devem ser compilados e vinculados para criar uma biblioteca compartilhada. Esses arquivos contêm os símbolos exportados que são referenciados em outros arquivos de origem.

    Para os exemplos neste artigo, dois arquivos de origem,share1.ceshare2.c, são usados. Os comandosshare1.c arquivo contém o seguinte código:

    /************
     * share1.c: shared library source.
    *************/
    
    #include <stdio.h>
    
    void func1 ()
     {
       printf("func1 called\n");
     }
    
    void func2 ()
     {
       printf("func2 called\n");
     }
    Os comandosshare2.carquivo contém o seguinte código:
    /************
     * share2.c: shared library source.
    *************/
    
    void func3 ()
     {
       printf("func3 called\n");
     }
    Os símbolos exportados nestes arquivos sãofunc1,func2efunc3.
  2. Crie um arquivo de origem principal que referencie os símbolos exportados que serão contidos na biblioteca compartilhada.

    Para os exemplos neste artigo o arquivo de origem principal denominadomain.cé usado. Os comandosmain.c arquivo contém o seguinte código:

    /************
     * main.c: contains references to symbols defined
     * in share1.c and share2.c
    *************/
    
    #include <stdio.h>
    
      extern void func1 (),
                     func2 (),
                     func3 ();
    main ()
     {
                     func1 ();
                     func2 ();
                     func3 ();
     }
  3. Crie o arquivo de exportação necessário para exportar explicitamente os símbolos na biblioteca compartilhada que são referenciados por outros módulos de objetos.

    Para os exemplos neste artigo, um arquivo de exportação denominadoshrsub.expé usado. Os comandosshrsub.exp arquivo contém o seguinte código:

    #! /home/sharelib/shrsub.o 
    * Above is full pathname to shared library object file
    func1
    func2
    func3
    Os comandos#!linha é significativa apenas quando o arquivo está sendo usado como um arquivo de importação. Neste caso, o#!linha identifica o nome do arquivo de biblioteca compartilhada a ser usado no tempo de execução.

Procedimento

  1. Compile e vincule os dois arquivos de código-fonte a serem compartilhados. (Este procedimento supõe que você esteja no diretório /home/sharedlib .) Para compilar e vincular os arquivos de origem, digite os seguintes comandos:
    cc -c share1.c
    cc -c share2.c
    cc -o shrsub.o share1.o share2.o -bE:shrsub.exp -bM:SRE -bnoentry
    Isso cria um nome de biblioteca compartilhadashrsub.ono diretório /home/sharedlib .
    -bandeira -bM:SRE
    Marca o arquivo de objeto resultanteshrsub.ocomo um reentrante, biblioteca compartilhada

    Cada processo que utiliza o código compartilhado ganha uma cópia privada dos dados em sua área de processo privado.

    flag
    Configura o ponto de entrada de dummy_nostartpara substituir o ponto de entrada padrão,_start
    -Sinalizador de bnoentrada
    Diz ao editor de linkage que a biblioteca compartilhada não tem um ponto de entrada

    Uma biblioteca compartilhada pode ter um ponto de entrada, mas o carregador do sistema não faz uso de um ponto de entrada quando uma biblioteca compartilhada é carregada.

  2. Utilize o seguinte comando para colocar a biblioteca compartilhada em um arquivo de arquivo:
    ar qv libsub.a shrsub.o
    Esta etapa é opcional. Colocar a biblioteca compartilhada em um arquivo torna mais fácil especificar a biblioteca compartilhada ao vincular o seu programa, pois você pode usar as bandeiras -l e -L com o comando ld .
  3. Compile e vincule o código-fonte principal com a biblioteca compartilhada para criar o arquivo executável. (Esta etapa assume que seu diretório de trabalho atual contém o arquivo main.c .). Use o comando a seguir:
    cc -o main main.c -lsub -L/home/sharedlib
    Se a biblioteca compartilhada não estiver em um arquivo, utilize o comando:
    cc -o main main.c /home/sharedlib/shrsub.o -L/home/sharedlib
    O programamainé agora executável. Os comandosfunc1,func2efunc3símbolos foram marcados para resolução adiada por tempo de carga. No tempo de execução, o carregador do sistema carrega o módulo em até a biblioteca compartilhada (a menos que o módulo já esteja carregado) e resolva dinamicamente as referências.
Nota: Ao criar uma biblioteca compartilhada a partir de um objeto C++, deve-se utilizar os nomes de símbolos C++ mandados no arquivo de exportação. No entanto, seu compilador C++ pode fornecer uma opção para criar a biblioteca compartilhada para você. Consulte a documentação do seu compilador para obter mais informações.
-Bandeira -L
Inclui o diretório especificado (neste caso,/home/sharedlib) para o caminho de busca da biblioteca, que é salvo na seção de carregadores do programa.

No tempo de execução o caminho de busca da biblioteca é usado para dizer ao carregador onde encontrar bibliotecas compartilhadas.

variável de ambiente LIBPATH
Uma lista separada por colon de caminhos de diretórios que também podem ser usados para especificar um caminho de pesquisa de biblioteca diferente. Seu formato é idêntico ao da variável de ambiente PATH .

Os diretórios da lista são procurados para resolver referências a objetos compartilhados. Os diretórios /usr/lib e /lib contêm bibliotecas compartilhadas e normalmente devem ser incluídos em seu caminho de pesquisa da biblioteca.