#llvm #llvm-ir #llvm-c -api #object-files
Вопрос:
Я хотел бы добавить символ компоновщика в проходе llvm, к которому я смогу получить доступ позже в сценарии компоновщика.
Например, чтобы показать, что я хотел бы видеть в результирующем объектном файле, вот файл сборки, который создает символ компоновщика с заданным значением.
$ cat sym.s
asdf = 0x1234
.global asdf
$ clang -c sym.s amp;amp; readelf --symbols sym.o
Symbol table '.symtab' contains 2 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000001234 0 NOTYPE GLOBAL DEFAULT ABS asdf
Я не мог видеть, как это сделать в библиотеке llvm (api c ), так как я не вижу, как взаимодействовать с таблицей символов, заданной дескриптором для модуля, когда мой проход вызывается через runOnModule(Module amp;M)
.
Я даже не уверен, как правильно это сделать из исходного файла llvm.
Вот моя лучшая попытка исследовать это направление
$ cat attempt.ll
target triple = "x86_64-pc-linux-gnu"
@asdf = global i8 1234, !absolute_symbol !0
!0 = !{ i64 1234, i64 1234 }
$ clang -c attempt.ll amp;amp; readelf --symbols attempt.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS attempt.ll
2: 0000000000000000 1 OBJECT GLOBAL DEFAULT 3 asdf
На самом !absolute_symbol
деле это не создает абсолютный символ в объектном файле. Вместо этого он по-прежнему создает переменную (в данном случае размером 1), и, по-видимому, переменная (не символ) имеет связанное значение. Так что такой подход к этому может оказаться тупиковым.
Так что возвращаемся в нужное русло:
- Как добавить символ, которому присвоен дескриптор, в
llvm::Module
?
Комментарии:
1. Похоже
llvm::MCContext
, что в конечном итоге он содержит более точное представление того, что оказывается в объектном файле, с таблицей символов иMCSymbol
буквами. Так что либо мне нужно лучше понять, как информация изModule
приводит к заполнению этого, либо, может быть, выяснить, как зарегистрировать более поздний пропуск, который получает что-то сMCContext
помощью ? (но это может произойти в llc вместо opt, и поэтому мой текущий способ написания пропусков плагинов, я думаю, не сработает, поэтому понимание того, как создать символ в вызове runOnModule из пропуска opt, было бы намного приятнее)