[llvm-dev] lld write wrong symbol value in .data section if enable -pie (original) (raw)
Peter Smith via llvm-dev llvm-dev at lists.llvm.org
Mon Jan 28 09:55:28 PST 2019
- Previous message: [llvm-dev] lld write wrong symbol value in .data section if enable -pie
- Next message: [llvm-dev] lld write wrong symbol value in .data section if enable -pie
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Hello Steven,
One difference between ld.lld and ld.bfd is that ld.lld defaults to --no-apply-dynamic-relocs (do not write the relocation addend) and ld.bfd defaults to --apply-dynamic-relocs (write the relocation addend). Can you try again with --apply-dynamic-relocs ?
Note that for RELA relocations a dynamic loader is supposed to resolve the relocation using the Addend in the relocation, ignoring the value in the place (.data section in your case). When linking -pie it is generally assumed that you will have a dynamic loader to resolve any relocations resulting from it so I don't think LLD is incorrect to put 0 in the .data section in this case.
There are a couple of things I don't understand about the output though:
- If the symbol we are relocating against has hidden visibility I'd expect a R_X86_64_RELATIVE relocation without a symbol for a -pie link.
- I thought R_X86_64_64 wasn't a dynamic relocation? I'm not that familiar with X86 so I could be missing something glaringly obvious here.
If --apply-dynamic-relocs doesn't work, would you consider making a small example and perhaps raise a PR? If it turns out not to be a problem we can always close it.
Peter
On Mon, 28 Jan 2019 at 15:35, Shi, Steven via llvm-dev < llvm-dev at lists.llvm.org> wrote:
Hi Rui,
I still fail to enable the lld in my Uefi firmware build to replace ld, and I found it is related to the wrong symbol values in the .data section, which are pointed by RX866464 relocation entries. I need your advices.
My firmware uses a linker script https://github.com/tianocore/edk2/blob/master/BaseTools/Scripts/GccBase.lds to do the linking. We use position independent code with hidden visibility to inform the compiler that symbol references are never resolved at runtime. My problem is I found after the lld linking with –pie enabled, the symbol values in .data section, which have the RX866464 relocation entries, are all 0. In other word, I found the S in below RX866464 calculation is 0. Name: RX866464 1 *word64 * S + A Below is an example to compare the lld and ld, sorry about the verbose. 1. Firstly, I use lld to link a HelloWorld module with -pie enabled: "/home/jshi19/llvm/releaseinstall/bin/ld.lld" -pie -z relro --hash-style=gnu --eh-frame-hdr -m elfx8664 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o /home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/DEBUG/HelloWorld.dll -u ModuleEntryPoint -L/usr/lib/gcc/x8664-linux-gnu/7.3.0 -L/usr/lib/gcc/x8664-linux-gnu/7.3.0/../../../x8664-linux-gnu -L/lib/x8664-linux-gnu -L/lib/../lib64 -L/usr/lib/x8664-linux-gnu -L/usr/lib/gcc/x8664-linux-gnu/7.3.0/../../.. -L/home/jshi19/llvm/releaseinstall/bin/../lib -L/lib -L/usr/lib -q --gc-sections -z max-page-size=0x40 --entry ModuleEntryPoint -Map /home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/DEBUG/HelloWorld.map --whole-archive -O0 -melfx8664 --oformat elf64-x86-64 --start-group @/home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/OUTPUT/staticlibraryfiles.lst --end-group --defsym=PECOFFHEADERSIZE=0x228 --script=/home/jshi19/wkspefi/lgao4/edk2/BaseTools/Scripts/GccBase.lds 2. Then, I check the RX866464 relocation entries in .rela.data section, and find their target offsets $ readelf -r /home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/DEBUG/HelloWorld.dll Relocation section '.rela.data' at offset 0x5b7e8 contains 41 entries: Offset Info Type Sym. Value Sym. Name + Addend … … 000000005040 00d600000001 RX866464 0000000000003130 TestFunction1 + 0 000000005048 00d700000001 RX866464 0000000000003150 TestFunction2 + 0 3. Next, I check the symbol values in .data section which are targeted by above RX866464 relocatons $ readelf -x2 HelloWorld.dll Hex dump of section '.data': NOTE: This section has relocations against it, but these have NOT been applied to this dump. … … 0x00005030 00000000 00000000 00000000 00000000 ................ 0x00005040 00000000 00000000 00000000 00000000 ................ 0x00005050 4ebe7903 06d77d43 b037edb8 2fb772a4 N.y...}C.7../.r. 0x00005060 00000000 00000000 00000000 00000000 ................ … … You can see the offset 0x5040 and 0x5048 symbol value are all 0, which is not correct. But if I remove the -pie option in the above step 1 lld link command, the 0x5040 and 0x5048 symbol values are correct. $ readelf -x2 HelloWorld.dll Hex dump of section '.data': NOTE: This section has relocations against it, but these have NOT been applied to this dump. … … 0x00005030 04420000 00000000 00000000 00000000 .B.............. 0x00005040 30310000 00000000 50310000 00000000 01......P1...... 0x00005050 4ebe7903 06d77d43 b037edb8 2fb772a4 N.y...}C.7../.r. 0x00005060 00000000 00000000 00000000 00000000 ................ … … And if I replace lld with ld but still use exact same link options with –pie enabled, the RX866464 symbol values are correct. 1. Link again with ld and same link options: ld -pie -z relro --hash-style=gnu --eh-frame-hdr -m elfx8664 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o /home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/DEBUG/HelloWorld.dll -u ModuleEntryPoint -L/usr/lib/gcc/x8664-linux-gnu/7.3.0 -L/usr/lib/gcc/x8664-linux-gnu/7.3.0/../../../x8664-linux-gnu -L/lib/x8664-linux-gnu -L/lib/../lib64 -L/usr/lib/x8664-linux-gnu -L/usr/lib/gcc/x8664-linux-gnu/7.3.0/../../.. -L/home/jshi19/llvm/releaseinstall/bin/../lib -L/lib -L/usr/lib -q --gc-sections -z max-page-size=0x40 --entry ModuleEntryPoint -Map /home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/DEBUG/HelloWorld.map --whole-archive -O0 -melfx8664 --oformat elf64-x86-64 --start-group @/home/jshi19/wkspefi/lgao4/edk2/Build/OvmfX64/NOOPTCLANG38/X64/MdeModulePkg/Application/HelloWorld/HelloWorld/OUTPUT/staticlibraryfiles.lst --end-group --defsym=PECOFFHEADERSIZE=0x228 --script=/home/jshi19/wkspefi/lgao4/edk2/BaseTools/Scripts/GccBase.lds 2. Then, check the .rela.data section RX866464 relocation entries: … … 000000004f40 00a400000001 RX866464 0000000000003130 TestFunction1 + 0 000000004f48 009a00000001 RX866464 0000000000003150 TestFunction2 + 0 … … 3. Check the RX866464 targeting symbol values in .data section … … 0x00004f30 f3410000 00000000 00000000 00000000 .A.............. 0x00004f40 30310000 00000000 50310000 00000000 01......P1...... 0x00004f50 00000000 00000000 00000000 00000000 ................ … … You can see the offset 0x4f40 and 0x4f48 symbol value are not 0, which is correct. Appreciate if you could give me some advices on how to let lld output correct symbol values when enable pie.
Thanks Steven
LLVM Developers mailing list llvm-dev at lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190128/b490b10d/attachment.html>
- Previous message: [llvm-dev] lld write wrong symbol value in .data section if enable -pie
- Next message: [llvm-dev] lld write wrong symbol value in .data section if enable -pie
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]