Как определить символ компоновщика в llvm?

#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, было бы намного приятнее)