Запуск LLC из ржавчины приводит к неопределенной ссылке на `main 'для связи с gcc - PullRequest
1 голос
/ 25 июня 2019

Рассмотрим привет мир в LLVM-IR

@.str = internal constant [14 x i8] c"hello, world\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
  %tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0
  %tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind
  ret i32 0
}

Когда я ни запускаю llc процесс из ржавчины:

use std::process::Command;
fn main() {
    Command::new("/usr/lib/llvm-8/bin/llc")
        .env_clear()
        .arg("test.bc")
        .arg("-o")
        .arg("test.s")
        .output()
        .expect("failed to execute process");
}

Не могу связать полученный test.s с gcc gcc test.s -no-pie -o test:

/ usr / bin / ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crt1.o: в функции _start':<br> (.text+0x20): undefined reference to main «
collect2: ошибка: ld вернул 1 статус выхода

Но когда я запустил llc прямо в терминале:

env -i /usr/lib/llvm-8/bin/llc test.bc -o test.s

Все хорошо работает.

Кто-нибудь знает некоторые детали?

...