Как извлечь секцию __bitcode / __ bundle из двоичного файла MachO - PullRequest
0 голосов
/ 19 апреля 2020

Для двоичного файла со встроенным битовым кодом (т. Е. Скомпилированного с -fembed-bitcode). Как я могу просто извлечь этот раздел так, чтобы я мог использовать этот файл битового кода, как любой другой файл битового кода, например, запустить opt или llvm-dis

В качестве тестового примера у меня есть программа hello-world:

// hello.cpp
#include<iostream>

int main() {
  std::cout << "hello world";
  return 0;
}

скомпилировано с: clang++ -O2 test.cpp -o test.o -fembed-bitcode -c

objdump показывает, что там есть раздел __ bitcode :

objdump -h test.o 

test.o: file format Mach-O 64-bit x86-64

Sections:
Idx Name          Size      Address          Type
  0 __text        000002eb 0000000000000000 TEXT 
  1 __gcc_except_tab 00000068 00000000000002ec DATA 
  2 __cstring     0000000c 0000000000000354 DATA 
  3 __bitcode     00002bc0 0000000000000360 DATA 
  4 __cmdline     00000046 0000000000002f20 DATA 
  5 __compact_unwind 00000060 0000000000002f68 DATA 
  6 __eh_frame    000000d0 0000000000002fc8 DATA 

Теперь согласно https://github.com/llvm/llvm-project/blob/master/llvm/test/tools/llvm-objcopy/MachO/dump-section.test, я пытаюсь извлечь секцию __ bitcode следующим образом:

# Take1
./bin/llvm-objcopy --dump-section=DATA,__bitcode=a.bc test.o 
./bin/llvm-objcopy: error: 'test.o': section 'DATA,__bitcode' not found

# Take2
./bin/llvm-objcopy --dump-section=__bitcode=a.bc test.o 
./bin/llvm-objcopy: error: 'test.o': section '__bitcode' not found

# Take3
./bin/llvm-objcopy --dump-section __DATA,__bitcode=a.bc test.o 
./bin/llvm-objcopy: error: 'test.o': section '__DATA,__bitcode' not found

# Take4
./bin/llvm-objcopy --dump-section=__DATA,__bitcode=a.bc test.o 
./bin/llvm-objcopy: error: 'test.o': section '__DATA,__bitcode' not found

Чего мне здесь не хватает?

1 Ответ

1 голос
/ 20 апреля 2020

На самом деле __bitcode находится в разделе LLVM. поэтому сработали следующие команды.

llvm-objcopy --dump-section=__LLVM,__bitcode=a.bc test.o
segedit test.o -extract __LLVM __bitcode a.bc

Похоже на ошибку в objdump, она не распознает раздел LLVM.

...