Pergunta

A maneira como o projeto da minha equipe é desenvolvido, geramos uma biblioteca de objetos compartilhada para nosso aplicativo de todos os nossos .o arquivos de objeto. Minha tarefa (espero que seja específica o suficiente, mas também geral o suficiente para ser útil para outras pessoas!) É vincular apenas os arquivos de objeto que mudaram desde a última vez que o executável foi criado. Por exemplo, aqui está a linha de comando que eu uso para construir o .so:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o   -o libMySharedLibrary.so

Que funciona como esperado! :) Meu objetivo é poder vincular apenas os arquivos de objeto alterados a partir de agora, para acelerar o processo de vinculação simultânea. Um comando de exemplo seria:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o   -o libMySharedLibrary.so

O que atualizaria libMySharedLibrary.so com os arquivos de objeto mais recentes, mantendo os arquivos de objeto mais antigos em libMySharedLibrary.so também. Na verdade, quando eu gero libMySharedLibrary.so Usando o comando acima, o tamanho do arquivo é muito menor do que o de quando todos os arquivos de objeto estão incluídos, para que eu quase possa ter certeza de que o comando acima não está fazendo o que eu quero.

Através da minha pesquisa, descobri que existe um -i opção para o vinculador, o mesmo que o -r Opção, que parece combinar todos os arquivos de objeto em um grande arquivo de objeto. Infelizmente, não parece que seja isso que eu quero.

Em resumo, gostaria de vincular apenas os arquivos de objeto alterados após o link inicial, resultando em um processo de vinculação mais rápido para os links futuros. Existe uma maneira de fazer isso?

Editar: um exemplo do que eu tentei com -i/-r:

Exemplo de comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

Eu tive que adicionar o -nostdlib tag para impedir que eu grite para mim sobre a necessidade e removido -shared Porque objetos compartilhados não são permitidos com o -r marcação.

Esse comando parece bater todos os meus arquivos .o em um grande arquivo .o. Portanto, se eu pudesse atualizar esse arquivo .O daqui em diante com apenas os arquivos .O alterados, isso seria ótimo. Depois que AllmyObjects.o foi criado inicialmente, tentei este comando: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, mas também criaria um (tamanho do tamanho de arquivo) muito menor AllMyObjects.o, então estou assumindo que não pode ter todos os arquivos de objeto. Eu sinto que isso é algo em que provavelmente estou cometendo um pequeno erro. Alguém tem algum conselho? Desde já, obrigado.

Foi útil?

Solução

Parece que você está certo sobre -shared e -r não trabalhando juntos. Fiquei cético em relação à sua antiga versão do GCC, mas mesmo no Ubuntu 10.10, posso ver o mesmo:

$ ld -shared -r
/usr/bin/ld.bfd.real: -r and -shared may not be used together

Infelizmente, isso significa que você alcançou um beco sem saída se precisar absolutamente de objetos compartilhados. O ligante Binutils simplesmente não o implementa.

Se as bibliotecas estáticas são uma opção para você, elas são simplesmente arquivos que podem ser facilmente manipulados com o ar Utilitário.

Caso contrário, você terá que procurar diferentes ligantes ou suítes do compilador. Não posso garantir que você encontrará esse recurso, porém, parece exótico.

Outras dicas

Você pode obter o comportamento que está depois de usar bibliotecas de arquivo/estático, mas o link inicial ainda levará a mesma quantidade de tempo.

Usando um arquivo de arquivo:

# Initially create the archive
ar r libmylib.a <all object files>

# Create your shared object (re-use this line after libmylib.a is updated)
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so     

# Update the archive file
ar r libmylib.a updated1.o updated2.o

Como eu disse, ainda levará a mesma quantidade de tempo para realmente vincular o .so como antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top