[llvm-dev] Have LLD load a file through memory

Frank Winter via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 12 14:21:47 PDT 2021


Hi.

I'm trying to use LLD to get it's input file from a string in memory instead of a file.

My use case is a JIT compiler (IR --> AMD GCN ISA) where calling the linker to make it a loadable object via system() is hitting a bug (somewhere in the system).

Here's what I do:

  1.  With the AMDGPU backend I write the output to a string
  2.  I sneak in this string into LLD via an added access function.
  3.  Since LLD invocation is only used in this form:
ld.lld -shared k.o -o k.so
I modified 'elf::readFile' to

  std::string tmp = qdp_jit_get_object();   // this retrieves the sneaky string

  llvm::outs() << "size   = " << tmp.size() << "\n";

  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer( StringRef( tmp.c_str() , tmp.length() ) );

  MemoryBufferRef mbref = mb->getMemBufferRef();

  return mbref;


When I then call LLD via lld::elf::link, I get

size   = 2192
ld: error: :1: unknown directive:
>>> A�E�A�E�@���?V@���?V�3��������}j<������� �J�0�ւ���j�
>>> ^

This is how the string containing the object was created:

   string str_obj;
   llvm::raw_string_ostream rss(str_obj);
   llvm::buffer_ostream bos(rss);


   if (TargetMachine->addPassesToEmitFile(CodeGenPasses,
  bos,
  nullptr,
  llvm::CodeGenFileType::CGFT_ObjectFile ))

CodeGenPasses.run(*Mod);


Is there anything wrong how I turn the string into a MemoryBuffer so that the link fails?

Thanks,
Frank


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210812/94c4ae50/attachment.html>


More information about the llvm-dev mailing list