Existe uma maneira de definir o campo elf NECESSÁRIO no tempo do link?

Dado um executável tal que:

>objdump -x someprog | grep c++
NEEDED               libstdc++.so.6

Desejo alterar o requisito para a versão completa (incluindo a versão secundária e o nível de patch):

>objdump -x someprog | grep c++
NEEDED               libstdc++.so.6.0.22

Conheço duas maneiras de fazer isso:

crie uma biblioteca fictícia conforme esta pergunta (Forçando ou impedindo o uso de uma versão secundária específica do libstdc ++)use patchelf
    >patchelf --add-needed libstdc++.so.6.0.22 someprog
    >objdump -x someprog | grep c++
    NEEDED               libstdc++.so.6
    NEEDED               libstdc++.so.6.0.22

(Eu não descobri uma linha de comando que funcione para --replace-needed)

Ambos parecem piratas para mim.Existe uma maneira de conseguir o mesmo no tempo de compilação ou link usando sinalizadores -Wl apropriados para o gcc?

Idealmente, quero evitar o uso de -nostdlib, pois isso exige que eu especifique não apenas o libstd ++, mas também o libc e tudo o mais para o qual desejo versões padrão.

Para uma biblioteca regular, apenas o link para a versão específica é suficiente para o libstdc ++, não é (ou melhor, suspeito que -stdlib substitua os nomes totalmente qualificados subsequentes que forneço).

fundo: Tenho executáveis que exigem uma versão posterior dolibstdc++ do que está instalado no sistema. Infelizmente, a versão instalada pode ser a mesma versão principal e, em caso afirmativo,ld felizmente usará a versão do sistema conforme ela corresponder àsoname libstdc++.so.6

Prefiro não vincular estaticamente, pois, na verdade, quero instalar muitos programas pequenos que compartilham o mesmo tempo de execução C ++ e isso incharia consideravelmente a instalação.

Algumas informações sobre o caminho de pesquisa da minha (the) biblioteca estão disponíveis aqui:

ld --verbose | grep SEARCH_DIR SEARCH_DIR ("/ usr / x86_64-redhat-linux / lib64"); SEARCH_DIR ("/ usr / lib64"); SEARCH_DIR ("/ usr / local / lib64"); SEARCH_DIR ("/ lib64"); SEARCH_DIR ("/ usr / x86_64-redhat-linux / lib"); SEARCH_DIR ("/ usr / local / lib"); SEARCH_DIR ("/ lib"); SEARCH_DIR ("/ usr / lib");

É claro no meu caso que / usr / lib64 está sendo pesquisado antes do RPATH do executável, que é:

>objdump -x /opt/foo/bin/bar | grep PATH
RPATH                $ORIGIN/../lib64/private:$ORIGIN/../lib64:$ORIGIN/

man ld.so sugere que a ordem de pesquisa deve ser:

Se uma dependência de biblioteca não contiver uma barra, ela será procurada na seguinte ordem:

   o  (ELF only) Using the directories specified in the DT_RPATH dynamic section attribute of the binary if present and DT_RUNPATH attribute does not exist.  Use of DT_RPATH is deprecated.

   o  Using the environment variable LD_LIBRARY_PATH.  Except if the executable is a set-user-ID/set-group-ID binary, in which case it is ignored.

   o  (ELF only) Using the directories specified in the DT_RUNPATH dynamic section attribute of the binary if present.

   o  From the cache file /etc/ld.so.cache, which contains a compiled list of candidate libraries previously found in the augmented library path.  If, however, the binary was linked with the  -z  node‐
      flib linker option, libraries in the default library paths are skipped.  Libraries installed in hardware capability directories (see below) are preferred to other libraries.

   o  In the default path /lib, and then /usr/lib.  If the binary was linked with the -z nodeflib linker option, this step is skipped.

similarmentehttps://software.intel.com/sites/default/files/m/a/1/e/dsohowto.pdf

Ambos parecem ser superados pelo uso real, mas na verdade não é esse o caso. o necessário é procurar links simbólicos:

>LD_LIBRARY_PATH= LD_DEBUG=libs ldd /opt/foo/bin/bar
 21720:     find library=libstdc++.so.6 [0]; searching
 21720:      search path=/opt/foo/bin/../lib64/private:/opt/foo/bin/../lib64:/opt/foo/bin                (RPATH from file /opt/foo/bin/bar)
 21720:       trying file=/opt/foo/bin/../lib64/private/libstdc++.so.6

Esta é uma interação com outra pergunta que eu tinhainstalar biblioteca importada compartilhada com os links necessários onde a sugestão era que os links não eram necessários. Eles claramenteestão necessário se você não especificar a versão semântica completa.

questionAnswers(2)

yourAnswerToTheQuestion