LINUX.ORG.RU

настраиваемый ld-linux.so


0

1

Есть ли в природе загрузчик библиотек, который в зависимости от имени бинарника (или других свойств), загружал заданную версию glibc?

Обычно решение проблемы одновременной работы разных приложений с разными версиями glibc предлагают через переменную среды LD_LIBRARY_PATH, но мне это как то не нравится...

★★★★★

Ответ на: комментарий от klalafuda

-Wl,-rpath требует перекомпиляции. Путь хороший, но только если есть из чего компилить и чем компилить. А бывает, что или сорцов не найти, или сорцы есть, но старыми компилятором он собирались, а новый ругается...

Пытался найти в Инете прогу, которая сможет отредактировать бинарник и добавить к нему DT_RPATH, нашел только chrpath, который может изменить значение DT_RPATH, если он уже присутствует, а вот добавить этот атрибут к бинарнику, собраному без -Wl,-rpath он не может...

mky ★★★★★
() автор топика
Ответ на: комментарий от mky

> -Wl,-rpath требует перекомпиляции.

не перекомпиляции, а перелинковки -> достаточно иметь [закрытые] объектные файлы :)

> Путь хороший, но только если есть из чего компилить и чем компилить. А бывает, что или сорцов не найти, или сорцы есть, но старыми компилятором он собирались, а новый ругается...

если нужно, можно и рукими поправить в уже собранном ELF [executable или shared object - не важно].

> Пытался найти в Инете прогу, которая сможет отредактировать бинарник и добавить к нему DT_RPATH, нашел только chrpath, который может изменить значение DT_RPATH, если он уже присутствует, а вот добавить этот атрибут к бинарнику, собраному без -Wl,-rpath он не может...

откройте для себя чудный мир objdump/objcopy из комплекта binutils :) последний доджен идти в комплекте с любой приличной системой, ходящей под gcc.

$ objdump -p /usr/pkg/bin/qnetwalk                                                                           

/usr/pkg/bin/qnetwalk:     file format elf32-i386

Program Header:
    PHDR off    0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2
         filesz 0x000000c0 memsz 0x000000c0 flags r-x
  INTERP off    0x000000f4 vaddr 0x080480f4 paddr 0x080480f4 align 2**0
         filesz 0x00000017 memsz 0x00000017 flags r--
    LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
         filesz 0x00014ded memsz 0x00014ded flags r-x
    LOAD off    0x00015000 vaddr 0x0805d000 paddr 0x0805d000 align 2**12
         filesz 0x00003244 memsz 0x0000331c flags rw-
 DYNAMIC off    0x00017b68 vaddr 0x0805fb68 paddr 0x0805fb68 align 2**2
         filesz 0x00000178 memsz 0x00000178 flags rw-
    NOTE off    0x0000010c vaddr 0x0804810c paddr 0x0804810c align 2**2
         filesz 0x00000018 memsz 0x00000018 flags r--

Dynamic Section:
  NEEDED      libqt-mt.so.3
  NEEDED      libpng.so.3
  NEEDED      libGL.so.1
  NEEDED      libXmu.so.6
  NEEDED      libXrandr.so.2
  NEEDED      libXcursor.so.1
  NEEDED      libXfixes.so.0
  NEEDED      libXinerama.so.1
  NEEDED      libXft.so.2
  NEEDED      libXrender.so.1
  NEEDED      libfontconfig.so.1
  NEEDED      libfreetype.so.6
  NEEDED      libz.so.0
  NEEDED      libexpat.so.0
  NEEDED      libICE.so.6
  NEEDED      libSM.so.6
  NEEDED      libXext.so.6
  NEEDED      libX11.so.6
  NEEDED      libstdc++.so.5
  NEEDED      libm.so.0
  NEEDED      libgcc_s.so.1
  NEEDED      libc.so.12
  RPATH       /usr/pkg/qt3/lib:/usr/pkg/lib:/usr/X11R6/lib
  INIT        0x804e0c0
  FINI        0x805a010
  HASH        0x8048124
  STRTAB      0x804a2a8
  SYMTAB      0x8048b28
  STRSZ       0x3074
  SYMENT      0x10
  DEBUG       0x0
  PLTGOT      0x805fd1c
  PLTRELSZ    0x9f8
  PLTREL      0x11
  JMPREL      0x804d6c4
  REL         0x804d62c
  RELSZ       0x98
  RELENT      0x8
  VERNEED     0x804d60c
  VERNEEDNUM  0x1
  VERSYM      0x804d31c

Version References:
  required from libgcc_s.so.1:
    0x0b792650 0x00 02 GCC_3.0

далее смотрим man по objcopy на предмет того, как цивилизованным образом изменить значение желаемого RPATH.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>не перекомпиляции, а перелинковки -> достаточно иметь [закрытые] объектные файлы :)

да с этим я и не спорю

>откройте для себя чудный мир objdump/objcopy из комплекта binutils :) последний доджен идти в комплекте с любой приличной системой, ходящей под gcc.

Мир objdump/objcopy действительно чудный...

>далее смотрим man по objcopy на предмет того, как цивилизованным образом изменить значение желаемого RPATH

Вопрос не как изменить, а как добавить RPATH если у бинарника исходного его не было?

А главный вопрос (про загрузчик) так и остался висеть в воздухе...

mky ★★★★★
() автор топика
Ответ на: комментарий от mky

> Вопрос не как изменить, а как добавить RPATH если у бинарника исходного его не было?

ну посмотрине в man objcopy, там всё есть :) AFAIR через objcopy можно извратить ELF практически как угодно.
ps: какие именно ключи на память я не помню.

> А главный вопрос (про загрузчик) так и остался висеть в воздухе...

ok, смотрим ещё раз:

---cut---
Есть ли в природе загрузчик библиотек, который в зависимости от имени бинарника (или других свойств), загружал заданную версию glibc?
---cut---

под "другими свойствами" можно понимать секции "NEEDED" и "RPATH" в исполняемом ELF-е? если да, то обычный загрузчик после исправления значения этих секций на желаемые вполне справится с задачей. например:

foo1: NEEDED=libc.so.123 RPATH=/lib1
foo2: NEEDED=libc.so.231 RPATH=/lib2

и так далее.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> ну посмотрине в man objcopy, там всё есть :) AFAIR через objcopy можно извратить ELF практически как угодно. ps: какие именно ключи на память я не помню.

впрочем, посмотрев man на objcopy я что-то не могу найти ничего, чтобы позволило модифицировать .dynamic :-/

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>под "другими свойствами" можно понимать секции "NEEDED" и "RPATH" в исполняемом ELF-е?

Да в принципе можно :)

Как то дискуссия протекает в форме диалога :))

klalafuda, спасибо за ответы, я то просто хотел убедится, что подобного загрузчика действительно нету и можно начиать его писать самому... Не хочется мне править бинарники, работают он и замечательно, а вот glibc надо бы обновить...

В Интернете масса Open Source проектов дублирующих друг-друга, вот я решил сначала спросить общественность, может уже где то есть (было) подобное... Например, chrpath http://freshmeat.net/projects/chrpath/?topic_id=46 говорит о существовании утилиты elfhack by Ric Klaren, но URL уже мертвый.

Еще мне понравилось http://sourceware.org/ml/binutils/1999-q2/msg00300.html --- такая программа нужна многим, но почему ее еще нет...

mky ★★★★★
() автор топика
Ответ на: комментарий от mky

> Еще мне понравилось http://sourceware.org/ml/binutils/1999-q2/msg00300.html --- такая программа нужна многим, но почему ее еще нет...

на этот вопрос IMHO вполне отвечает дискуссия:

http://groups.google.com/group/comp.unix.solaris/browse_thread/thread/5754ede...

-> если элемента rpath небыло - c'est la vie, не судьба.

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.