Обман Linux: исполняемые файлы и зависимые библиотеки через LD_PRELOAD - PullRequest
4 голосов
/ 03 ноября 2011

Извините за заголовок, я не мог придумать что-либо еще, чтобы описать проблему:)

Хорошо, так вот как это происходит: я пытаюсь использоватьпроприетарное бесплатное приложение под Linux (и, следовательно, проблема; если бы у меня был исходный код, я мог бы перестроить его).Кроме того, я пытаюсь запустить его на неподдерживаемой версии Linux, и почти все компоненты приложения работают по отдельности, но не вместе (как это должно быть, если приложение работает полностью).

Позвольте мне немного уточнить.Есть графический интерфейс, который отлично запускается в неподдерживаемых ОС.Затем из этого графического интерфейса вы можете вызвать несколько инструментов командной строки - полезно, чтобы графический интерфейс также выплевывал командную строку, вызываемую в каждом случае.

Теперь при вызове из GUI некоторые из этих команд завершаются неудачно - однако, поскольку у меня есть фактическая вызванная командная строка (скажем, "extprogram -arg1 1 -arg2 2 ..."), я могу повторить их с терминала.Итак, я обнаружил, что приложение в целом несет свои собственные библиотеки libc;и с помощью этих библиотек (некоторые из) команд (запускаемых из терминала), как правило, происходит сбой - однако я обнаружил, что из командной строки это обычно работает для тех, которые терпят неудачу:

LD_PRELOAD=/usr/lib/libstdc++.so.6 extprogram -arg1 1 -arg2 2 ...

# or alternatively, this works too:
# LD_LIBRARY_PATH=/usr/lib extprogram -arg1 1 -arg2 2 ...

(вДругими словами, использование системы libstdc ++ вместо поставляемого приложением имеет тенденцию исправлять ошибки)

Итак, теперь, если бы я мог убедить GUI вызвать эти инструменты с помощью «LD_PRELOAD»/ "LD_LIBRARY_PATH" - я думаю, все будет работать нормально ...

К сожалению, графический интерфейс не вызывает сценарий, который будет вызывать эти исполняемые файлы, которые я мог бы изменить напрямую (насколько я могумог видеть через grep ping) - похоже, это исполняемый файл GUI, который создает системные вызовы;Я попробовал 'strace' - ing, но я не могу найти что-то вроде временного сценария или чего-либо, что я мог бы изменить ...

Итак, я подумал, что могу "обмануть"с созданием исполняемого скрипта bash;поэтому я перемещаю исполняемый файл - и создаю сценарий, который должен вызывать перемещенный исполняемый файл с LD_ prepended:

mv extprogram extprogram.old
cat > extprogram <<EOF
LD_LIBRARY_PATH=/usr/lib extprogram $@
EOF

... но это не удается;по-видимому, приложение GUI распознает что-то не так.

Итак, я подумал - возможно ли каким-то образом, может быть, иметь «обертку» для кода C / C ++, которая каким-то образом «загрузит» этот исполняемый файл, но в «среде»в котором установлено «LD_LIBRARY_PATH=/usr/lib» - и передать ему свои аргументы (а также вернуть возвращаемое значение)?Тогда я мог бы встроить эту «обертку» изначально в ОС, с тем же именем, что и исходный исполняемый файл, - и все это работало, не касаясь исходного исполняемого файла (кроме переименования).

Большое спасибо заранее за любые ответы,
Ура!

Ответы [ 2 ]

9 голосов
/ 03 ноября 2011

Ты рядом.Вы забыли шебанг и сделали сценарий исполняемым.Также вы вызывали неправильную внешнюю программу.Наконец, я бы использовал абсолютный путь к старому сценарию, потому что вы не знаете, каким будет CWD для графического интерфейса.

mv extprogram extprogram.old
cat > extprogram <<EOF
#!/bin/sh
LD_LIBRARY_PATH=/usr/lib exec /psth/to/extprogram.old "$@"
EOF
chmod +x extprogram
1 голос
/ 03 ноября 2011

использование системной библиотеки libstdc ++ вместо поставляемого приложения имеет тенденцию исправлять ошибки

Мне было бы интересно узнать, какие проблемы вызывает использование libstdc++.so.6, предоставляемого приложением, ноесли система что-то исправляет, то гораздо более простым решением является удаление (переименование) проблемной библиотеки, а не целое решение оболочки оболочки.

Если приложение не может найти «плохую» библиотеку,есть большая вероятность, что она найдет системную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...