Turn: alta versão do gcc para compilar um programa rodando em uma máquina glibc versão inferior

Autor: chnmagnus
link: https: //www.jianshu.com/p/77d7f7dc93b3
Fonte: Jane livros

 

Por exemplo, usamos gcc 9.3.0 compilador, mas a necessidade de publicar o máquinas gcc versão 4.8.5, como fazer?

Você pode pensar dos seguintes métodos

  1. compilado estaticamente
  2. liberação Container
  3. Embalado tão dependente, por isso execute um programa usando locais

1. compilador estático (a maioria das cenas não trabalho)

Em que o compilador estático não trabalho, libstdc ++ é compilado estaticamente, mas não forneceu função libc nesta área, mesmo se você estiver programa CPP, ainda uma alta probabilidade de depender libc.so
por nm <bin> | grep GLIBC_se o glibc dependente determinar o seu programa, se não você pode considerar libstdc compilado estaticamente direta ++.

2. O recipiente de libertação (parte da cena pode ser utilizada)

Use um contentor com publisher ambiente gcc9.3.0, é possível. Mas, em alguns casos, não há recipiente e sem privilégios sudo, ainda não muito simpática.

3. embalados libertação de modo dependente (plano geral)

Este método, embora não parece muito elegante, mas, na verdade, se você tem algum conhecimento do arquivo elf, é uma boa maneira. De acordo com os seguintes métodos específicos disse.

3.1 Modo 1 é rpath conjunto e ligante dinâmica em tempo de compilação

Quando você começa um código fonte do programa condicional, e pode ser recompilados, você pode especificar os parâmetros diretamente em tempo de compilação para resolver.
Deixe-me tempo de compilação para adicionar parâmetros:

# 绝对路径
gcc -Wl,-rpath='/my/lib',-dynamic-linker='/my/lib/ld-linux.so.2' 

parâmetros gcc

-Wl, opção
opção passagem como uma opção para o vinculador.

parâmetros ld

-rpath = dir
Adicionar um diretório para o caminho de tempo de execução de pesquisa da biblioteca. Isto é usado quando vincular um executável ELF com objetos compartilhados.
--dynamic-vinculador = arquivo
Definir o nome do vinculador dinâmico.

elf arquivar esses dois parâmetros são fornecidos nos campos de intérprete e rPath.

rpath
nome completo run-time search path, é um arquivo elf em um campo que especifica o local da pesquisa de modo a primeira prioridade quando um arquivo executável é executado, o compilador padrão geral deixe o campo vazio. arquivo elf também tem um RUNPATH semelhante campo, o seu papel e rpath semelhante, mas ligeiramente menor prioridade de pesquisa. Pesquisar Prioridade:

rpath > LD_LIBRARY_PATH > runpath > ldconfig缓存 > 默认的/lib,/usr/lib等 

Se você precisa especificar uma pasta lib caminho relativo, você pode usar o ORIGEM variável, ld vai ORIGEM interpretada como caminho para o arquivo executável está localizado.

gcc -Wl,-rpath='$ORIGIN/../lib' 

intérprete
nome completo elf interpreter, usado para carregar o arquivo de elfo. O campo no link irá ajudá-lo automaticamente definido, o programa de 64 bits em geral /lib64/ld-linux-x86-64.so.2. Este é também um dos pit tão cheio, muitas pessoas (como eu) para encontrar o programa depende assim por ldd, embalados na máquina de destino ou modificar pontos rpath LD_LIBRARY_PATH para o diretório lib local, mas programa ldd, encontrar / lib64 / LD- linux-x86-64.so.2 neste ponto, o sistema ainda tanta. A razão é que o campo é codificado no arquivo elf, não sujeito a LD_LIBRARY_PATH afetados.

Trazer estes dois parâmetros ao compilar o seguinte programa depende de você só precisa embalar assim que uma cópia pode ser publicada com o programa.

3.2 Modo 2 modificar directamente rPath e intérprete binários

Quando você não pode compilar o programa, você também pode modificar rpath e intérprete por outros meios. Este caso requer o uso de uma ferramenta patchelf, através dnf install patchelfde instalar. Você pode modificar rpath e arquivo elf intérprete através dele:

patchelf --set-rpath /my/lib your_program
patchelf --set-interpreter /my/lib/ld-linux.so.2 your_program

Além do caminho absoluto, um caminho mais comum é o uso de pré-implantação pwdpara obter o caminho atual, usando um caminho relativo para o lib local.

patchelf --set-rpath `pwd`/../lib your_program
patchelf --set-interpreter `pwd`/../lib/ld-linux-x86-64.so.2 ./your_program
 
 

Acho que você gosta

Origin www.cnblogs.com/water-bear/p/12607475.html
Recomendado
Clasificación