diferença entre -h e -o opções em cc (C ++)
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
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