[llvm-dev] Why -pie option force LLD to output shared obj file type, not executable? (original) (raw)
Peter Smith via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 23 08:13:17 PST 2019
- Previous message: [llvm-dev] Why -pie option force LLD to output shared obj file type, not executable?
- Next message: [llvm-dev] Why -pie option force LLD to output shared obj file type, not executable?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hello Steven,
I'm not Rui, but I may be able to help. We recently ran into something like this on AArch64 with pr39810 lld would not accept --pie and --shared simultaneously.
In general even on ld.bfd use of the --pie linker option sets the file type to ET_DYN, ld.bfd has a special case when the start of the text section is non 0 (I think). This was described in https://sourceware.org/ml/binutils/2013-12/msg00081.html . As far as I know this was for non-position independent executables that had been compiled -fPIE just to get the small code model.
In the AArch64 case the problem was that --shared was being used to work around ld.bfd using ET_EXEC, unfortunately it seems like you need the ET_EXEC behaviour? If so I don't think that there are any flags that you can give to lld to change this.
My understanding is that the only difference in the file ld.bfd generates is the e_type field in the ELF header. It would be trivial to write a quick tool to change the field from ET_DYN to ET_EXEC.
Hope this is of some use.
Peter
On Wed, 23 Jan 2019 at 15:47, Shi, Steven via llvm-dev <llvm-dev at lists.llvm.org> 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 uint16t getELFType() { if (Config->Pic) return ETDYN; if (Config->Relocatable) return ETREL; return ETEXEC; }
Thanks Steven
LLVM Developers mailing list llvm-dev at lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
- Previous message: [llvm-dev] Why -pie option force LLD to output shared obj file type, not executable?
- Next message: [llvm-dev] Why -pie option force LLD to output shared obj file type, not executable?
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]