Pergunta

Estou construindo .so biblioteca e queria saber - qual é a diferença b / opção cc complier -H e -o (usando o Sun Studio C ++) w?

Não são eles estão se referindo à mesma coisa? - o nome do arquivo de saída

Foi útil?

Solução

-o é o nome do arquivo que será gravado em disco pelo compilador

-h é o nome que será gravado em binários ELF que apontam contra este arquivo.

Um uso comum é fornecer números de versão menores biblioteca. Por exemplo, se você está criando o libfoo biblioteca compartilhada, que você pode fazer:

cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1

Então se você compilar seu aplicativo Olá mundo e ligação contra ela com

cc -o hello -lfoo

o binário elf para Olá irá gravar uma entrada NEEDED para libfoo.so.1 (que você pode veja executando elfdump -d hello).

Então, quando você precisa adicionar novas funções mais tarde, você pode alterar o valor -o para libfoo.so.1.1 mas deixar o -h na libfoo.so.1 - todos os programas que você já construídas com 1,0 ainda tentam libfoo.so.1 carga em tempo de execução, de modo continuar a trabalhar sem ser reconstruído, mas você verá via ls que é 1.1.

Esta é também por vezes utilizado na construção de bibliotecas no mesmo diretório que eles estão usado em tempo de execução, se você não tem um diretório de instalação separada ou instalar por meio de um sistema de embalagem. Para evitar programas quebrando que estão sendo executados quando você substituir o binário biblioteca, e evitar programas não ser capaz de começar quando você está no meio do edifício, alguns Makefiles vai fazer:

cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1

(Makefiles construído pelo gerador Imake makefile velho de X comumente fazer isso.)

Outras dicas

Eles estão se referindo a nomes diferentes. Especificamente, a opção -o é real nome do arquivo - o único no sistema de arquivos. A opção -h define o interno DT_SONAME no arquivo objeto final. Este é o nome pelo qual o objeto compartilhado é referenciado internamente por outros módulos. Eu acredito que é o nome que você também vê quando você executar ldd em objetos que apontam para ele.

A opção -o irá nomear o arquivo de saída enquanto a opção -h irá definir um nome intrínseca dentro da biblioteca. Este nome intrínseca tem precedência sobre o nome do arquivo quando usado pelo carregador dinâmico e permite que ele use regras pré-definidas para espiar a biblioteca direita.

Você pode ver o nome intrínseca foi gravado em uma determinada biblioteca com esse comando:

elfdump -d xxx.so | grep SONAME

Dê uma olhada aqui para mais detalhes:

http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.html

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