как найти символы, которые должны быть экспортированы - PullRequest
0 голосов
/ 11 ноября 2018

Если вы компилируете с -fvisibility=hidden или с msvc, вам придется экспортировать символы общей библиотеки вручную. В качестве эксперимента, как вы могли бы найти их автоматически с помощью сопоставителей AST (clang-query)?

Это не так просто, поскольку желателен минимальный набор деклараций экспорта, и все быстро усложняется встроенными функциями, шаблонами, определениями шаблонов вне строки, статическими членами данных и т. Д.

Также приветствуется общий ответ на стандартном языке LLVM IR или C ++.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Вы сможете получить эту информацию через AST MatchFinder.Простой сопоставитель, такой как

namedDecl().bind("named_decl")

, будет соответствовать всем NamedDecl узлам.Затем в обратном вызове вы можете получить атрибут Linkage узла и соответствующим образом обработать узел.Обратный вызов, который распечатывает, какие символы имеют внешнюю связь, может выглядеть примерно так:

struct LinkagePrinter : public MatchFinder::Callback {
  void run(MatchResult const & result) override {
    using namespace clang;
    NamedDecl const * n_decl =     
      result.Nodes.getNodeAs<NamedDecl("named_decl");
    if(n_decl){
      Linkage l = n_decl->getLinkage();
      switch(l){
        case ExternalLinkage:
          std::cout << "symbol " << n_decl->getNameAsString() 
             << " has external linkage\n";
        // ... etc 
      } 
    } 
    return;
  }
}; // LinkagePrinter

Это примерно правильно - я не проверял, что это компилируется.Зарегистрируйте совпадение и обратный вызов с помощью MatchFinder, загрузите MatchFinder в инструмент, и вы должны быть в бизнесе.В https://github.com/lanl/CoARCT.

имеется множество примеров.
0 голосов
/ 11 ноября 2018

Не уверен насчет clang-query, но если клиенты вашей библиотеки используют существующие публичные заголовки, вы можете собирать объявления, ожидая их через libclang. Простой пример этого приведен в проекте ShlibVisibilityChecker (он идентифицирует ложный экспорт из общих библиотек).

...