Como posso criar um link para uma versão específica da glibc?

Quando eu compilo algo no meu Ubuntu Lucid 10.04 PC, ele é ligado ao glibc. Lucid usa 2,11 da glibc. Quando eu executo este binário em outro PC com um glibc mais antigo, o comando falha dizendo que não há nenhum glibc 2.11 …

Tanto quanto eu sei, a glibc usa o version control de símbolos. Posso forçar o gcc a vincular-se a uma versão de símbolo específica?

No meu uso concreto eu tento compilar um toolchain cruzado do gcc para o ARM.

Você está correto em que a glibc usa o version control de símbolo. Se você está curioso, a implementação de versionamento de símbolos introduzida no glibc 2.1 é descrita aqui e é uma extensão do esquema de versões de símbolos da Sun descrito aqui .

Uma opção é vincular estaticamente seu binário. Esta é provavelmente a opção mais fácil.

Você também pode construir seu binário em um ambiente de compilation chroot ou usando um compilador cruzado glibc- new => glibc- old .

De acordo com a postagem no blog http://www.trevorpounds.com , é possível forçar qualquer símbolo a ser vinculado a um mais antigo, desde que seja válido usando o mesmo .symver pseudo-op que é usado para definir símbolos versionados em primeiro lugar. O exemplo a seguir é extraído da postagem do blog .

O exemplo a seguir faz uso do caminho real da glibc, mas garante que ele esteja vinculado a uma versão 2.2.5 mais antiga.

 #include  #include  #include  __asm__(".symver realpath,realpath@GLIBC_2.2.5"); int main() { char* unresolved = "/lib64"; char resolved[PATH_MAX+1]; if(!realpath(unresolved, resolved)) { return 1; } printf("%s\n", resolved); return 0; } 

Link com -static . Quando você vincula com -static o vinculador incorpora a biblioteca dentro do executável, então o executável será maior, mas ele pode ser executado em um sistema com uma versão mais antiga do glibc porque o programa usará sua própria biblioteca em vez da do sistema .