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

Rui Ueyama via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 23 11:01:54 PST 2019


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> 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/20190123/b61f284f/attachment.html>


More information about the llvm-dev mailing list