A instalação local do glibc-2.23 faz com que todos os programas segfault

7

Estou tentando atualizar o glibc em um sistema no qual não tenho acesso root. Portanto, estou instalando em um prefixo local. Eu gostaria de receber ajuda para entender as práticas recomendadas para configurar isso, além de ajudar a resolver um problema específico. (O resumo rápido do meu problema: quando incluo o caminho glibc lib recém-instalado no meu LD_LIBRARY_PATH , cada programa que eu tentei executar, incluindo ls, vim, pwd, etc. segfault.)

Informações básicas:

$ uname -a
Linux 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Compilador / toolchain: Estou executando um compilado localmente e instalado a partir da versão fonte do gcc 5.3.0. Parece funcionar bem. Isso é instalado em ~/toolchains/gcc_5.3.0

$ ls ~/toolchains/gcc_5.3.0
bin  include  lib  lib32  lib64  libexec  share

Tentativa de instalar: glibc-2.23 da origem com --prefix=~/local/

Eu não tenho sudo nesta máquina (é um cluster compartilhado; a política é instalar sua própria toolchain se você precisar de personalização, como eu).

$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64

A versão do glibc instalada pelo sistema é 2.19:

$ ldd --version
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.7) 2.19

(Acima e abaixo, estou substituindo ~ por caminhos absolutos acima para maior clareza)

Problema:

Eu sou capaz de compilar e instalar o glibc-2.23 com o gcc 5.3.0, assim como o gcc 4.8.4 instalado pelo sistema. Compilação e instalação para ~ / local / funciona bem quando LD_LIBRARY_PATH é definido como acima. No entanto, para alavancar as novas bibliotecas glibc (instaladas em ~ / local / lib), adicionei ~ / local / lib ao final do meu atual LD_LIBRARY_PATH :

$ echo $LD_LIBRARY_PATH
~/toolchains/gcc_5.3.0/lib:~/toolchains/gcc_5.3.0/lib64:~/local/lib

Assim que faço isso, tudo eu tento executar segfaults. Eu não posso nem ls ou correr vim. Acabei de ver a impressão de bash "Falha de segmentação". Eu tenho que mudar meu LD_LIBRARY_PATH , e então tudo funciona bem novamente.

Eu não consigo executar gdb ou strace nem nada para tentar descobrir o que está acontecendo (esses segmentos também).

Perguntas:

  1. Alguma idéia sobre o que está acontecendo aqui?

  2. Tenho a sensação de que minha abordagem para instalação e / ou configuração de LD_LIBRARY_PATH não está correta. Qual é a prática recomendada para o gcc instalado localmente e o glibc instalado localmente? Preciso combinar versões mais cuidadosamente? Acabei de pegar as últimas fontes estáveis de cada uma.

  3. Para meu próprio conhecimento para o futuro, dado que o gdb não funciona, existem outras maneiras de depurar esse tipo de coisa para que eu possa localizar com precisão onde o segfault está ocorrendo?

Obrigado por qualquer pensamento que você tenha.

Editar: Eu geralmente estou tentando obter um conjunto atualizado de ferramentas no meu sistema, e obter cabeçalhos e bibliotecas dev necessários, etc. Por exemplo, para usar características avançadas de perf_events, eu preciso de um monte de outras coisas, tais como libaudit. Isso, claro, precisa de ldap, berkeley db, etc., etc. Em última análise, eu estou precisando de alguns cabeçalhos que parecem ser apenas fornecido por versões mais modernas da glibc. Por exemplo, aqui está um erro que recebo quando estou tentando compilar berkeley db; esse tipo parece estar definido em dirent.h, que é um cabeçalho na glibc, embora o sistema não esteja encontrando nos pacotes instalados meu sistema:

 -fPIC -DPIC -o .libs/os_dir.o

../src/os/os_dir.c: In function '__os_dirlist':

../src/os/os_dir.c:45:2: error: unknown type name 'DIR'

  DIR *dirp;

  ^

Eu estaria interessado em saber se há abordagens alternativas aqui para obter acesso aos cabeçalhos e bibliotecas de desenvolvimento que meu sistema não está encontrando sozinho. O erro acima com DIR talvez seja um bom exemplo.

    
por Kulluk007 28.03.2016 / 14:53

1 resposta

5

Por causa de uma incompatibilidade de ld-linux-x86-64.so.2 (man ld.so) e libc.so.

Se você deseja executar o gdb na configuração LD_LIBRARY_PATH, execute o seguinte:

export LD_LIBRARY_PATH=~/local/lib
/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /usr/bin/gdb /bin/ls

Isso executa / usr / bin / gdb no ambiente de biblioteca antigo e / bin / ls no novo ambiente de biblioteca. Da mesma forma, você pode executar apenas um comando no novo ambiente de biblioteca da seguinte forma:

export LD_LIBRARY_PATH=~/local/lib
~/local/lib/ld-linux-x86-64.so.2 /bin/echo
    
por 28.03.2016 / 19:34

Tags