Как перенаправить ошибки компоновщика без использования оператора перенаправления?

#c #linux

#c #linux

Вопрос:

[Этот вопрос не касается исправления ошибки. Но о его перенаправлении]

У меня есть программа (C / linux), которая отображает ошибку на консоли из-за отсутствия общей библиотеки. Он говорит «не удается загрузить библиотеку ….» . Как я могу перенаправить этот вывод в файл?

Я попробовал это в своей программе:

 close(2);
open("/home/user/test.txt", O_CREAT|O_RDWR);
  

Он корректно перенаправляет выходные данные, сгенерированные из программы printfs. Но «не удается загрузить библиотеку ….» все еще появляется на консоли!

Я не хочу использовать оператор> для этой цели. Я хочу сделать это из своей программы. Есть предложения?

Спасибо

Ответ №1:

Загрузчик генерирует сообщение об ошибке, которое происходит еще до запуска программы. Таким образом, вы ничего не можете сделать из программы, которая даже не запускается, чтобы повлиять на поведение загрузчика.

Если вам действительно нужно поработать с файловыми дескрипторами, используемыми оболочкой, проверьте команду exec оболочки, чтобы закрыть и перенаправить файловые дескрипторы навсегда. Таким образом, вы можете обойти использование оператора перенаправления > , хотя это, возможно, гораздо менее аккуратный подход.

Комментарии:

1. Понял. Таким образом, загрузчик не выполняется в контексте процесса. Но как насчет ошибок во время выполнения, таких как «… Символ не найден …», что происходит во время выполнения. Кто генерирует ошибки типа symbol not found в программе? Это динамический компоновщик?

2. Если вы ссылаетесь на dlopen etc., То эти ошибки создаются соответствующей библиотечной функцией (например libdl ); поскольку они записываются в stderr from с вашей программой, вы должны иметь возможность их контролировать.

Ответ №2:

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

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

Ответ №3:

Похоже, что сообщение генерируется до запуска вашей программы, поэтому для его перенаправления вам придется использовать оператор 2>. В противном случае вам придется использовать dlopen … и т.д. вызовы для выполнения компоновки во время выполнения.

Ответ №4:

попробуйте убедиться, что переменная среды LD_LIBRARY_PATH указана правильно.

Комментарии:

1. Я отредактировал свой вопрос, чтобы прояснить его. Речь идет не об исправлении ошибки. Ошибка для меня в порядке. Речь идет о перенаправлении его из самой программы

Ответ №5:

эти предупреждения и сообщения об ошибках появляются, когда ваша программа начинает работать, поэтому единственным вариантом является> operator

используйте этот способ

 ./a.out >amp;  filename