Байт-код LLVM, связанный с ld.lld, дает ошибку сегментации - PullRequest
0 голосов
/ 02 июня 2019

Я написал простую программу на C:

example.c:

int main() {
    return 0;
}

Затем преобразовал его в .ll, используя

clang -S -emit-llvm example.c

Который сгенерировал файл example.ll, который выглядит следующим образом:

; ModuleID = 'example.c'
source_filename = "example.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  ret i32 0
}

attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 8.0.0-3 (tags/RELEASE_800/final)"}

Затем я преобразовал .ll файл в .o, используя:

llc -filetype=obj example.ll

И затем я попытался связать этот файл, чтобы сделать его исполняемым, используя:

ld.lld example.o -o example -e main

Который создал исполняемый файл ./example.

Пример выполнения выдает ошибку сегментации

29185 segmentation fault (core dumped)  ./example

objdump of example.o выглядит так:

example.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
   b:   31 c0                   xor    %eax,%eax
   d:   5d                      pop    %rbp
   e:   c3                      retq   

И исполняемый файл выглядит так:

example:     file format elf64-x86-64


Disassembly of section .text:

0000000000201000 <main>:
  201000:   55                      push   %rbp
  201001:   48 89 e5                mov    %rsp,%rbp
  201004:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
  20100b:   31 c0                   xor    %eax,%eax
  20100d:   5d                      pop    %rbp
  20100e:   c3                      retq  

Я также пытался связать объектный файл с ld , но это также не сработало. Я что-то пропустил. Как я могу сделать исполняемый файл объектного файла llvm? Обратите внимание, что ни одна из команд не выдает никаких ошибок или предупреждений.

1 Ответ

0 голосов
/ 03 июня 2019

Ну, это не то, как вы должны связать исполняемый файл.Например, точка входа должна называться «_start» и т. Д., Поэтому здесь вам не хватает связки объектов / библиотек инициализации во время выполнения.

Любая связь с clang (так, clang example.ll или clang example.o)или передайте -v для вызова clang, чтобы получить правильную команду линкера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...