Как выполнить код, измененный с LLVM, который ссылается на внешние библиотеки - PullRequest
0 голосов
/ 18 мая 2019
  1. У меня был файл server.cpp, который я могу запустить, используя:
 g++ -o server server.cpp -lrpc -ldl -lpthread

Преобразовал файл в LLVM IR, изменил его и сохранил в файл с помощью функции WriteBitcodeToFile.Имя результирующего файла - «output».

Используемая команда llc для генерации файла «output.o»:

 llc -filetype=obj output
Использованная команда gcc для создания исполняемого файла:
gcc -lrpc -ldl -lpthread output.o

Запуск команды gcc выдает мне ошибки:

/usr/bin/ld: output.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
Попробовал, указав флаг "--relocation-model = pic" для команды llc.Но если после этого я запускаю команду gcc, я получаю так много «неопределенных ссылок на» ошибки, такие как:
/usr/bin/ld: output.o: in function `main':
llvm-link:(.text+0x41): undefined reference to `rpc::server::server(unsigned short)'
/usr/bin/ld: llvm-link:(.text+0x4d): undefined reference to `std::allocator<char>::allocator()'
/usr/bin/ld: llvm-link:(.text+0x60): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
/usr/bin/ld: llvm-link:(.text+0x81): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
/usr/bin/ld: llvm-link:(.text+0x8a): undefined reference to `std::allocator<char>::~allocator()'
/usr/bin/ld: llvm-link:(.text+0x93): undefined reference to `rpc::server::run()'
/usr/bin/ld: llvm-link:(.text+0xa5): undefined reference to `rpc::server::~server()'
/usr/bin/ld: llvm-link:(.text+0xc8): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'

Если у меня нет внешних библиотек, я могу запустить простую программу после измененийлегко используя описанные выше шаги.

...