[llvm-dev] lld-link /ALIGN option doesn't work for the "execute in place (XIP)"
Rui Ueyama via llvm-dev
llvm-dev at lists.llvm.org
Sun Aug 4 20:52:48 PDT 2019
Hi Steven,
I need to take a look in more detail, but I believe that magic number is
hard-coded without any particular reason and we can change that to match
the behavior of MSVC linker.
On Sat, Aug 3, 2019 at 11:14 PM Shi, Steven <steven.shi at intel.com> wrote:
> Hi Rui,
>
> We meet a problem when enable the *execute in place* (XIP,
> https://en.wikipedia.org/wiki/Execute_in_place) for uefi firmware with
> lld-link. We need to set the COFF executable file SectionAlignment through
> the lld-link /ALIGN option, but we find the SectionAlignment is hardcoded
> to 4096 which cause the /ALIGN option doesn’t work at all. Below is the
> hardcode in lld:
>
>
>
> lld\COFF\Writer.h
>
> static const int pageSize = 4096;
>
> lld\COFF\Writer.cpp
>
> pe->SectionAlignment = pageSize;
>
>
>
> The uefi firmware need to directly run in ROM device (in XIP way) before
> the system memory is ready. These XIP executable files are not loaded in
> memory and their section running alignment is just same as the alignment in
> file. With MSVC link.exe, we can use the /ALIGN option to set
> SectionAlignment same as FileAlignment to ensure the XIP executable file
> has correct running alignment. But with lld-link, we cannot change the XIP
> file SectionAlignment value 4096 because it is hardcoded. So, we have to
> change the FileAlignment to 4096 to match the SectionAlignment instead, but
> the big FileAlignment value (4096) cause the firmware XIP code size is +10
> times larger than normal, which is not affordable for firmware.
>
>
>
> Could we not hardcode the SectionAlignment as 4096 in COFF file and let
> the lld-link respect the user’s /ALIGN option value? We can set the 4096 as
> the default SectionAlignment value.
>
>
>
>
>
> Below are some steps to show the hardcode issue and code size impact:
>
> $ cat main.c
>
> int main()
>
> {
>
> return 0;
>
> }
>
> $ "/home/jshi19/llvm/llvm-project/releaseinstall/bin/clang" -target
> i686-unknown-windows -fno-builtin -c -o main.obj main.c
>
> $ "/home/jshi19/llvm/llvm-project/releaseinstall/bin/lld-link"
> /OUT:main.dll /MACHINE:X86 /DLL /ENTRY:main /ALIGN:32 /FILEALIGN:32 main.obj
>
> $ sudo apt install pev
>
> $ readpe -H main.dll
>
> …
>
> Alignment of sections: 0x1000
>
> Alignment factor: 0x20
>
> …
>
> $ ll main.dll, see main.dll size is 544
>
> -rwxrwxr-x 1 jshi19 jshi19 544 Aug 3 21:58 main.dll*
>
>
>
> If have to change the FileAlignment to 4096 to match the SectionAlignment:
>
> $ "/home/jshi19/llvm/llvm-project/releaseinstall/bin/lld-link"
> /OUT:main.dll /MACHINE:X86 /DLL /ENTRY:main /ALIGN:32 /FILEALIGN:4096
> main.obj
>
> $ readpe -H main.dll
>
> …
>
> Alignment of sections: 0x1000
>
> Alignment factor: 0x1000
>
> …
>
> $ ll main.dll, see main.dll size is 8192 which ~15 timer larger.
>
> -rwxrwxr-x 1 jshi19 jshi19 8192 Aug 3 22:05 main.dll*
>
>
>
>
>
>
>
> Thanks
>
> Steven
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190805/95660559/attachment.html>
More information about the llvm-dev
mailing list