[llvm-dev] Why -pie option force LLD to output shared obj file type, not executable? (original) (raw)

Shi, Steven via llvm-dev llvm-dev at lists.llvm.org
Mon Jan 28 04:59:15 PST 2019


Hi Peter, Rui Thank you for the info.

Thanks Steven

From: Rui Ueyama [mailto:ruiu at google.com] Sent: Thursday, January 24, 2019 3:02 AM To: Shi, Steven <steven.shi at intel.com> Cc: llvm-dev at lists.llvm.org Subject: Re: Why -pie option force LLD to output shared obj file type, not executable?

lld sets ET_DYN instead of ET_EXEC if -pic is specified, which is basically the same behavior except the case that Peter explained. Unfortunately, there's no way to set ET_EXEC using lld, but the "type" field is 2 byte long and at offset 16, so you can edit it using a binary editor to change it from ET_DYN to ET_EXEC (although it's super hacky).

If you have GNU sed, you can do with the following command to change the field value:

sed -E -i -e '1s/^(.{16})../\1\x2\x0/' your-executable-file

Does that work for you?

On Wed, Jan 23, 2019 at 7:47 AM Shi, Steven <steven.shi at intel.com<mailto:steven.shi at intel.com>> wrote: Hello Rui, I’m enabling the LLD in the Uefi firmware edk2 build. I meet a problem about the -pie option and cannot output the executable type obj file correctly. I need your advice. The Uefi firmware executable binary is the position independent + small code mode in 64bits. So we always add the options “-Wl,-pie -mcmodel=small” in our clang build toolchain. These options work well with binutils LD, but cannot work with LLD. I see the LLD uses the below code to force the output obj file as shared obj type if link with -pie. Is there any way to let LLD output executable type obj with -pie option? I’m OK if I have to link twice, first output DYN and then covert to EXEC in some way. Could you give some link command examples on it?

lld\ELF\Writer.cpp static uint16_t getELFType() { if (Config->Pic) return ET_DYN; if (Config->Relocatable) return ET_REL; return ET_EXEC; }

Thanks Steven

-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190128/3eab252a/attachment.html>



More information about the llvm-dev mailing list