#c #linux #ld-preload
#c #linux #ld-предварительная нагрузка
Вопрос:
У меня есть общий объект, который выполняет некоторые printf()
операции с помощью атрибута для инициализации; Довольно просто. Он просто информирует меня о некоторых переменных, которые я установил.
Когда я делаю LD_PRELOAD=mylib.so ./program.sh -flags
program.sh
выплевывания ошибок из-за printfs:
./program_run: line 16: cd: mylib.so: Startup
.: File name too long
./program_run: line 18: test: too many arguments
Затем программа обычно запускается. Похоже, что скрипт bash поврежден с printf()
помощью s, когда он выполняет проверку переменных.
Есть ли обходной путь?
Комментарии:
1. Выводить
stderr
вместоstdout
. Многие команды в скриптах bash используютstdout
, и вы не можете просто добавить к ним случайный текст.
Ответ №1:
Попробуйте это:
LD_PRELOAD=./mylib.so ./program.sh -flags
Обратите внимание на путь перед mylib.so
Мой опыт показывает, что лучше использовать полный путь, например
LD_PRELOAD=/home/source/mylib/mylib.so ./program.sh -flags
Осторожно используйте экспорт, как упоминалось выше.
Это может вызвать всевозможные непреднамеренные проблемы.
Ответ №2:
Попробуйте с этими изменениями:
export LD_PRELOAD=mylib.so ; ./program.sh -flags
Использует ли функция printf() аргументы переменной?
Комментарии:
1. Один из них делает, я передаю номер версии через define, то есть: #define VERSION 2.000 затем printf(«Текущая версия: %f», ВЕРСИЯ)
2. Я закомментировал все printfs() в общем объекте. Скрипт bash больше не выдает ошибок. возможно, пытаюсь найти способ отображения текста из этого модуля без искажения того, что делает bash.
3. В mylib.so , определяете ли вы новый printf? Могу ли я это увидеть?
4. void altprintf(char* str, …) { char buf[256]; va_list аргументы; va_start(аргументы, str); vsprintf(buf, str, аргументы); va_end(аргументы); printf(buf); }
5. Мне очень жаль, но я не понимаю, в чем проблема