Использование printf в LLVM IR

Итак, я писал компилятор для простого лиспа на Rust и генерировал LLVM IR с помощью ящика Inkwell . Пытаясь найти способ вывода значений на стандартный вывод, я натолкнулся на множество ответов на использование функции печати, как в C/C++. Кажется, что по большей части работает без проблем.

Однако в сгенерированном IR отображается только объявление функции, поэтому это, вероятно, означает, что определение где-то связано с самим llvm (в настоящее время используется интерпретатор lli, поскольку это намного проще для тестирования). Во всяком случае, я просто пытался понять, где эта функция определена. Например, есть ли основной модуль в llvm, где он определен? Или используется printf, зависящий от Unix-подобной платформы, вместо того, чтобы быть частью llvm, поскольку большинство функций llvm, похоже, имеют префикс «llvm»?

1 ответ

Решение

определен в стандартной библиотеке C (libc).

Поэтому, когда вы компилируете свой llvm IR в объектные файлы, а затем связываете их, вам нужно будет установить ссылку на libc, чтобы иметь возможность использовать (обратите внимание, что довольно часто объектные файлы, созданные LLVM, связываются с помощью компилятора C, такого как gcc или clang, который автоматически связывается с libc).

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

Другие вопросы по тегам