Извините за заголовок, я не мог придумать что-либо еще, чтобы описать проблему:)
Хорошо, так вот как это происходит: я пытаюсь использоватьпроприетарное бесплатное приложение под 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
» - и передать ему свои аргументы (а также вернуть возвращаемое значение)?Тогда я мог бы встроить эту «обертку» изначально в ОС, с тем же именем, что и исходный исполняемый файл, - и все это работало, не касаясь исходного исполняемого файла (кроме переименования).
Большое спасибо заранее за любые ответы,
Ура!