Есть ли способ автоматически установить переменную среды, когда двоичный файл ELF начинает выполнение? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть двоичный исполняемый файл mytest, созданный с помощью Clang и bfd / lld, и для того, чтобы он работал правильно, я должен передать ему переменную окружения ASAN_OPTIONS="use_sigaltstack=1", но я хочу избежать ввода вручнуючто каждый раз, когда я хочу запустить исполняемый файл из командной строки.

Конечно, я мог бы создать скрипт-обертку, но это добавляет сложности.

Есть ли способ при созданиидвоичный файл, чтобы прикрепить переменную среды и ее значение к двоичному файлу, чтобы он автоматически устанавливался при запуске?

Слишком поздно устанавливать переменную среды в моем коде, потому что Асан читает переменную среды раньшемой код начинает работать.

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Первым делом: для Асана рекомендуемый подход - реализовать __asan_default_options (как описано в Asan wiki ).

В общем, вы можете сбросить переменную среды, вызвав setenv / putenv при запуске программы. Но это не помогло бы, если бы переменная использовалась в коде инициализации (как в случае с Asan).

Вы могли бы также предоставить пользовательскую хакерскую реализацию getenv, которая бы возвращала желаемое значение для "ASAN_OPTIONS" и впередк нормальной реализации Glibc (полученной через dlsym) в противном случае. Но это не помогло бы и с Асаном, потому что он получает переменные окружения, читая /proc/self/environ.

0 голосов
/ 02 октября 2019

Я хочу не вводить вручную этот код при каждом запуске исполняемого файла из командной строки.

Один из способов добиться этого - повторно execvдвоичный файл, если он обнаружит, что ASAN_OPTIONS отсутствует. То есть: в main проверьте, установлено ли ASAN_OPTIONS через getenv. Если нет, вызовите setenv(ASAN_OPTIONS, ...) и execv(argv[0], argv).

Осторожно: это затрудняет отладку двоичного файла (er).

...