Как я могу получить путь к clang, когда clang запускает компоновщик?

#llvm #llvm-clang

#llvm #llvm-clang

Вопрос:

Я работаю с LLVM 8.0 и clang и выполняю некоторую работу во время оптимизации, и мне нужно получить путь к clang. Я запускаю clang, используя -flto флаг, так что clang фактически вызывает компоновщик и, в конечном счете, мой код. Я делаю это в Ubuntu 16.04.

Я пытаюсь получить путь к изображению с помощью readlink("/proc/self/exe"); . Образ clang был собран в моей домашней папке, поэтому путь, который я указываю для запуска clang, /home/users/me/llvm/build/llvm/bin/clang . У меня также есть версия clang, установленная в /usr/bin/clang .

Что я получаю от вызова readlink , так это: /usr/bin/ld . Что я хочу получить, так это: /home/users/me/llvm/bin/clang .

Я понимаю, что -flto вызывает system() с /usr/bin/ld ... в качестве команды для запуска. Но как я могу получить clang путь? Поскольку у меня есть несколько версий clang , я не могу использовать whereis или тому подобное, поскольку он вернет либо неправильный, либо несколько.

Есть ли глобальная переменная в LLVM, или какой-либо способ запроса LLVM, или какой-либо способ, который я еще не обнаружил, чтобы получить путь к изображению для родительского процесса?


Предложения по использованию getppid и использованию в «?/proc //exe» сработали отлично.

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

1. Может быть, вы можете использовать getppid and then readlink("/proc/<ppid>/exe") ?

2. getppid это вероятный ответ, но возможно, что нужный вам pid не является прямым родителем … было что-то в том, что clang вызывал компоновщик через кого-то? Я забыл детали. В любом случае, если вы используете Linux и хотите получить pid дедушки или другого предка, вам нужно посмотреть на PPid поле /proc/<pid>/status .

Ответ №1:

Предложение @Ismail было идеальным. Сделал именно то, что я хотел.