как найти символы, которые должны быть экспортированы

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

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

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

0

Решение

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

0

Другие решения

Вы должны быть в состоянии получить эту информацию через 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