64 template <
class T>
static void append(std::vector<uint8_t> &
B,
const T &Data) {
66 B.resize(
S +
sizeof(
T));
78 size_t Pos =
B.size();
79 size_t Offset =
B.size();
85 for (
const auto &
S : Strings) {
86 B.resize(Pos +
S.length() + 1);
87 strcpy(
reinterpret_cast<char *
>(&
B[Pos]),
S.c_str());
88 Pos +=
S.length() + 1;
115 size_t Pos =
S.find(
From);
125 return make_error<StringError>(
127 "' with '" + To +
"' failed").str()), object_error::parse_failed);
130 return (
Twine(
S.substr(0, Pos)) + To +
S.substr(Pos +
From.size())).str();
134 "__NULL_IMPORT_DESCRIPTOR";
141 class ObjectFactory {
148 std::string ImportDescriptorSymbolName;
149 std::string NullThunkSymbolName;
154 ImportDescriptorSymbolName((
"__IMPORT_DESCRIPTOR_" +
Library).str()),
155 NullThunkSymbolName((
"\x7f" +
Library +
"_NULL_THUNK_DATA").str()) {}
184 ObjectFactory::createImportDescriptor(std::vector<uint8_t> &Buffer) {
185 const uint32_t NumberOfSections = 2;
187 const uint32_t NumberOfRelocations = 3;
192 u16(NumberOfSections),
194 u32(
sizeof(Header) + (NumberOfSections *
sizeof(
coff_section)) +
199 (ImportName.
size() + 1)),
200 u32(NumberOfSymbols),
208 {{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'2'},
216 u16(NumberOfRelocations),
220 {{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'6'},
223 u32(ImportName.
size() + 1),
234 append(Buffer, SectionTable);
238 u32(0), u32(0), u32(0), u32(0), u32(0),
240 append(Buffer, ImportDescriptor);
250 append(Buffer, RelocationTable);
253 auto S = Buffer.size();
254 Buffer.resize(
S + ImportName.
size() + 1);
256 Buffer[
S + ImportName.
size()] =
'\0';
260 {{{0, 0, 0, 0, 0, 0, 0, 0}},
266 {{{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'2'}},
272 {{{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'6'}},
278 {{{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'4'}},
284 {{{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'5'}},
290 {{{0, 0, 0, 0, 0, 0, 0, 0}},
296 {{{0, 0, 0, 0, 0, 0, 0, 0}},
308 sizeof(
uint32_t) + ImportDescriptorSymbolName.length() + 1;
310 sizeof(
uint32_t) + ImportDescriptorSymbolName.length() + 1 +
312 append(Buffer, SymbolTable);
317 NullThunkSymbolName});
319 StringRef F{
reinterpret_cast<const char *
>(Buffer.data()), Buffer.size()};
324 ObjectFactory::createNullImportDescriptor(std::vector<uint8_t> &Buffer) {
325 const uint32_t NumberOfSections = 1;
331 u16(NumberOfSections),
333 u32(
sizeof(Header) + (NumberOfSections *
sizeof(
coff_section)) +
336 u32(NumberOfSymbols),
344 {{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'3'},
357 append(Buffer, SectionTable);
361 u32(0), u32(0), u32(0), u32(0), u32(0),
363 append(Buffer, ImportDescriptor);
367 {{{0, 0, 0, 0, 0, 0, 0, 0}},
375 append(Buffer, SymbolTable);
380 StringRef F{
reinterpret_cast<const char *
>(Buffer.data()), Buffer.size()};
384 NewArchiveMember ObjectFactory::createNullThunk(std::vector<uint8_t> &Buffer) {
385 const uint32_t NumberOfSections = 2;
392 u16(NumberOfSections),
394 u32(
sizeof(Header) + (NumberOfSections *
sizeof(
coff_section)) +
399 u32(NumberOfSymbols),
407 {{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'5'},
420 {{
'.',
'i',
'd',
'a',
't',
'a',
'$',
'4'},
435 append(Buffer, SectionTable);
449 {{{0, 0, 0, 0, 0, 0, 0, 0}},
457 append(Buffer, SymbolTable);
462 StringRef F{
reinterpret_cast<const char *
>(Buffer.data()), Buffer.size()};
470 size_t ImpSize = ImportName.
size() + Sym.
size() + 2;
473 memset(Buf, 0, Size);
481 Imp->SizeOfData = ImpSize;
483 Imp->OrdinalHint = Ordinal;
496 std::vector<uint8_t> Buffer;
497 const uint32_t NumberOfSections = 1;
503 u16(NumberOfSections),
505 u32(
sizeof(Header) + (NumberOfSections *
sizeof(
coff_section))),
506 u32(NumberOfSymbols),
514 {{
'.',
'd',
'r',
'e',
'c',
't',
'v',
'e'},
524 append(Buffer, SectionTable);
528 {{{
'@',
'c',
'o',
'm',
'p',
'.',
'i',
'd'}},
534 {{{
'@',
'f',
'e',
'a',
't',
'.',
'0',
'0'}},
540 {{{0, 0, 0, 0, 0, 0, 0, 0}},
546 {{{0, 0, 0, 0, 0, 0, 0, 0}},
565 append(Buffer, SymbolTable);
570 char *Buf = Alloc.
Allocate<
char>(Buffer.size());
571 memcpy(Buf, Buffer.data(), Buffer.size());
579 std::vector<NewArchiveMember> Members;
582 std::vector<uint8_t> ImportDescriptor;
583 Members.push_back(OF.createImportDescriptor(ImportDescriptor));
585 std::vector<uint8_t> NullImportDescriptor;
586 Members.push_back(OF.createNullImportDescriptor(NullImportDescriptor));
588 std::vector<uint8_t> NullThunk;
589 Members.push_back(OF.createNullThunk(NullThunk));
611 return Name.takeError();
613 if (!
E.AliasTarget.empty() && *
Name !=
E.AliasTarget) {
614 Members.push_back(OF.createWeakExternal(
E.AliasTarget, *
Name,
false));
615 Members.push_back(OF.createWeakExternal(
E.AliasTarget, *
Name,
true));