LD_PRELOAD, bash и printf

#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. Мне очень жаль, но я не понимаю, в чем проблема