J'ai simple passe de LLVM qui renomme toutes les fonctions définies dans l'unité de traduction en cours (i.e.: le fichier source en question, après toutes les étapes de pré-traitement ont eu lieu - voir here). Mon passe est la suivante:Comment relier deux modules de code binaire LLVM?
#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/TypeFinder.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/GlobalValue.h"
using namespace llvm;
namespace {
struct FunctionRename : public ModulePass {
static char ID; // Pass identification
FunctionRename() : ModulePass(ID) {}
bool runOnModule(Module &M) override {
// Rename all functions
for (auto &F : M) {
StringRef Name = F.getName();
// Leave library functions alone because their presence or absence
// could affect the behaviour of other passes.
if (F.isDeclaration())
continue;
F.setLinkage(GlobalValue::LinkOnceAnyLinkage);
F.setName(Name + "_renamed");
}
return true;
}
};
}
char FunctionRename::ID = 0;
static RegisterPass<FunctionRename> X("functionrename", "Function Rename Pass");
// ===-------------------------------------------------------==//
//
// Function Renamer - Renames all functions
//
Après avoir exécuté le passage sur un fichier de code binaire, file.bc
, je sortie le résultat dans un nouveau fichier file_renamed.bc
, comme suit
opt -load /path/to/libFunctionRenamePass.so -functionrename <file.bc> file_renamed.bc
Je tente alors de relier les deux fichiers comme suit
llvm-link file.bc file_renamed.bc -o file_linked.bc
Cependant, je reçois toujours affrontements de symboles pour les fichiers source C (à partir de laquelle le fichier initial est généré code binaire) où les constructeurs et destructeurs sont impliqués. Mon attente est que la ligne
F.setLinkage(GlobalValue::LinkOnceAnyLinkage)
empêcherait les affrontements de symboles qui se produisent pour tous les symboles définis dans file.bc
et file_renamed.bc
.
Qu'est-ce que je fais mal?
Pouvez-vous fournir le texte réel des erreurs que vous recevez? – jvstech