Date: Thu, 19 Jan 2017 21:05:30 +0100 From: Roman Divacky <rdivacky@vlakno.cz> To: Mark Millard <markmi@dsl-only.net> Cc: FreeBSD Toolchain <freebsd-toolchain@freebsd.org> Subject: Re: /usr/bin/ld.lld on powerpc64: produces a.out for which: ld-elf.so.1: assert failed: /usr/src/libexec/rtld-elf/powerpc64/reloc.c:374 Message-ID: <20170119200530.GA58089@vlakno.cz> In-Reply-To: <278EB6CA-6A04-43D6-A9F2-84FF11A367C7@dsl-only.net> References: <27422F1B-6906-4D37-860A-D1BC8DC83BBF@dsl-only.net> <20170117195424.GA89237@vlakno.cz> <237EB920-0795-4B18-94D4-2EAC0FC76F01@dsl-only.net> <20170117215613.GA95258@vlakno.cz> <45D0BB1C-490A-4809-BAB1-F4E552FECEDD@dsl-only.net> <20170118215420.GA65399@vlakno.cz> <9023794B-0999-4F50-95DE-2D4156BC6E75@dsl-only.net> <DDC0F517-C606-402C-80D0-BE3C941D97CB@dsl-only.net> <545CE5A1-9E7F-46C0-8355-0C32B60D1C72@dsl-only.net> <278EB6CA-6A04-43D6-A9F2-84FF11A367C7@dsl-only.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Type = 38 should be R_ABS so thats fine. If what I expected to be in .got is in .got.plt, what happens if you modify the getPPC64TocBase() to use ::GotPlt instead of ::Got ? On Thu, Jan 19, 2017 at 01:46:02AM -0800, Mark Millard wrote: > I should have noted that -pie gets the same sort of > readonly segment errors as -shared did: > > # clang -fuse-ld=lld -g -pie empty_src.c > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 50 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 10 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > undefined symbol: main in /usr/lib/Scrt1.o > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > # more main.c > int main () > { > } > # clang -fuse-ld=lld -g -pie main.c > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 50 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 10 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 50 > Type = 50 > Type = 48 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > > So making something with a relocatable global variable is problematical > via lld. > > === > Mark Millard > markmi at dsl-only.net > > On 2017-Jan-18, at 10:48 PM, Mark Millard <markmi at dsl-only.net> wrote: > > The log messages code does not work because of Assertion failures: > > # clang -fuse-ld=lld -g main.c > Type = 50, name = Assertion failed: (!isLocal()), function getName, file /usr/src/contrib/llvm/tools/lld/ELF/Symbols.cpp, line 100. > clang: error: unable to execute command: Abort trap (core dumped) > clang: error: linker command failed due to signal (use -v to see invocation) > > So for now I've disabled the name part of the line. At least we will > see the numeric type of each and the reports of any "unhandled" values. > > I decided to use the Got variation instead of the Plt variant first. > > Some examples: > > # more empty_src.c > > # clang -fuse-ld=lld -g -shared -o empty_src.so empty_src.c > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > can't create dynamic relocation R_PPC64_REL24 against readonly segment > Type = 38 > Unhandled type = 38 > Type = 51 > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > # clang -fuse-ld=lld -g empty_src.c > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > undefined symbol: main in /usr/lib/crt1.o > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > # more main.c > volatile void* gblvar = 0; > > int main () > { > gblvar = &gblvar; > } > > # clang -fuse-ld=lld -g main.c > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 50 > Type = 48 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 1 > Unhandled type = 1 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > > # more main.c > int main () > { > } > > # clang -fuse-ld=lld -g main.c > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 50 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 10 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 50 > Type = 64 > Type = 64 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 64 > Type = 50 > Type = 48 > Type = 50 > Type = 64 > Type = 50 > Type = 64 > Type = 50 > Type = 48 > Type = 10 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 50 > Type = 48 > Type = 50 > Type = 48 > Type = 10 > Type = 38 > Unhandled type = 38 > Type = 51 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 1 > Unhandled type = 1 > Type = 38 > Unhandled type = 38 > Type = 38 > Unhandled type = 38 > > > === > Mark Millard > markmi at dsl-only.net > > On 2017-Jan-18, at 3:41 PM, Mark Millard <markmi@dsl-only.net> wrote: > > On 2017-Jan-18, at 1:54 PM, Roman Divacky <rdivacky@vlakno.cz> wrote: > > > I think I got it all wrong. I think what lld is trying to achieve > > is to have the PLT entry to jump to GOT which references the real symbol. > > From what I've read: for code references the .got.plt section would > be involved when it exists, not the .got section. > > > For some reason, GOT is empty, in our case. > > I think that I've already explained this: lld produces two different > sections instead of just one .got section: .got and .got.plt . > > .got is now for only global variables. (These can be in the > RELRO region: read-only after upfront relocation.) My program > had no global variables. If you want I can change it to have one > and use it so that the .got will not be empty. > > .got.plt is for code references that allow lazy relocation. > (These can not being the the RELRO region.) Having the global > variable would not change this from what I can tell. > > In the older toolchain these were both in the .got section and > the global variable relocations could not be in the RELRO region > because of the mixing in one section. > > > I believe this might be caused > > by a relocation thats wrongly mapped to R_ABS in PPC64TargetInfo::getRelExpr(). > > That is not it from what I can tell reading about what the .got.plt > section is for and why it was split from the .got section. > > I think I'll add a global variable and use it so that their is no > question what goes in the .got section instead of having no examples. > > I think you are not going in the right direction now for what the > .got section is for as lld is producing things for powerpc64 (not > that I'm an expert in the older or newer techniques). > > > Mark, can you apply this patch and rerun the linking and send me back what > > relocations are applied to what symbols? Or even, if there's an unhandled > > relocation, try to adjust the switch and rerun your test? > > I think that I will first add the global variable and its use > and show what the last change with Plt instead of Got ends > up looking like --but with your log notices added. > > Then I'll retry with the Plt use reverted. > > > Thanks > > > > Index: ../tools/lld/ELF/Target.cpp > > =================================================================== > > --- ../tools/lld/ELF/Target.cpp (revision 292428) > > +++ ../tools/lld/ELF/Target.cpp (working copy) > > @@ -1075,7 +1075,8 @@ > > } > > > > PPC64TargetInfo::PPC64TargetInfo() { > > - PltRel = GotRel = R_PPC64_GLOB_DAT; > > + GotRel = R_PPC64_GLOB_DAT; > > + PltRel = R_PPC64_JMP_SLOT; > > RelativeRel = R_PPC64_RELATIVE; > > GotEntrySize = 8; > > GotPltEntrySize = 8; > > @@ -1114,8 +1115,10 @@ > > } > > > > RelExpr PPC64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { > > + llvm::outs() << "Type = " << Type << ", name = " << S.getName() << "\n"; > > switch (Type) { > > default: > > + llvm::outs() << "Unhandled type = " << Type << "\n"; > > return R_ABS; > > case R_PPC64_TOC16: > > case R_PPC64_TOC16_DS: > > It may be a bit before I get the Plt and/or Got examples done. > I might report the Plt case first and separately, later report > the Got case. > > === > Mark Millard > markmi at dsl-only.net > > On Tue, Jan 17, 2017 at 09:38:07PM -0800, Mark Millard wrote: > > Using the new changed line (Plt use now): > > > > uint64_t TocVA = Out<ELF64BE>::Plt->getVA(); > > > > changed the behavior and it gets farther for > > -fuse-ld=lld based linking. But it is r2 leading > > to r3 content that is dereferenced and 8(r3) fails > > this time. This was in the process of finding > > the new r2 value for the following bctrl. > > r2==0x10018560 initially in __do_global_ctors_aux > > seems wrong. If so then objlist_call_init produced > > a wrong r2 value. > > > > [I've no clue if this is what you expected from > > the Plt experiment or not.] > > > > Details. . . > > > > # /usr/local/bin/gdb a.out > > GNU gdb (GDB) 7.11.1 [GDB v7.11.1 for FreeBSD] > > . . . > > Reading symbols from a.out...done. > > (gdb) run > > Starting program: /root/c_tests/a.out > > > > Program received signal SIGSEGV, Segmentation fault. > > 0x00000000100104a8 in .__do_global_ctors_aux () > > (gdb) bt > > #0 0x00000000100104a8 in .__do_global_ctors_aux () > > #1 0x0000000010010518 in ._init () > > #2 0x000000005002ac78 in objlist_call_init (list=<optimized out>, lockstate=<optimized out>) at /usr/src/libexec/rtld-elf/rtld.c:2541 > > #3 0x0000000050029fa8 in _rtld (sp=<optimized out>, exit_proc=<optimized out>, objp=<optimized out>) at /usr/src/libexec/rtld-elf/rtld.c:668 > > #4 0x00000000500279b0 in ._rtld_start () at /usr/src/libexec/rtld-elf/powerpc64/rtld_start.S:83 > > Backtrace stopped: frame did not save the PC > > (gdb) disass > > Dump of assembler code for function .__do_global_ctors_aux: > > 0x0000000010010470 <+0>: mflr r0 > > 0x0000000010010474 <+4>: std r31,-8(r1) > > 0x0000000010010478 <+8>: std r0,16(r1) > > 0x000000001001047c <+12>: stdu r1,-128(r1) > > 0x0000000010010480 <+16>: addis r3,r2,-1 <<<<<==== Note: r3 derives from r2 > > 0x0000000010010484 <+20>: mr r31,r1 > > 0x0000000010010488 <+24>: addi r3,r3,32464 > > 0x000000001001048c <+28>: std r30,112(r31) > > 0x0000000010010490 <+32>: ld r3,-8(r3) > > 0x0000000010010494 <+36>: cmpdi r3,-1 > > 0x0000000010010498 <+40>: beq 0x100104d4 <.__do_global_ctors_aux+100> > > 0x000000001001049c <+44>: addis r4,r2,-1 > > 0x00000000100104a0 <+48>: addi r4,r4,32464 > > 0x00000000100104a4 <+52>: addi r30,r4,-8 > > => 0x00000000100104a8 <+56>: ld r4,8(r3) <<<<<==== Note: 8(r3) fails. > > 0x00000000100104ac <+60>: ld r11,16(r3) > > 0x00000000100104b0 <+64>: ld r3,0(r3) > > 0x00000000100104b4 <+68>: std r2,40(r1) > > 0x00000000100104b8 <+72>: mr r2,r4 <<<<<==== Note: 8(r3) result should have been the new r2 value > > 0x00000000100104bc <+76>: mtctr r3 > > 0x00000000100104c0 <+80>: bctrl > > 0x00000000100104c4 <+84>: ld r2,40(r1) > > 0x00000000100104c8 <+88>: ldu r3,-8(r30) > > 0x00000000100104cc <+92>: cmpdi r3,-1 > > 0x00000000100104d0 <+96>: bne 0x100104a8 <.__do_global_ctors_aux+56> > > 0x00000000100104d4 <+100>: ld r30,112(r31) > > 0x00000000100104d8 <+104>: addi r1,r1,128 > > 0x00000000100104dc <+108>: ld r0,16(r1) > > 0x00000000100104e0 <+112>: ld r31,-8(r1) > > 0x00000000100104e4 <+116>: mtlr r0 > > 0x00000000100104e8 <+120>: blr > > 0x00000000100104ec <+124>: .long 0x0 > > 0x00000000100104f0 <+128>: .long 0x0 > > 0x00000000100104f4 <+132>: .long 0x0 > > End of assembler dump. > > (gdb) info registers > > r0 0x10010518 268502296 > > r1 0xffffffffffffcbf0 18446744073709538288 > > r2 0x10018560 268535136 > > r3 0x7ca903a64e800421 8982714944583631905 > > r4 0x10010430 268502064 > > r5 0x100300d0 268632272 > > r6 0x50043ab0 1342454448 > > r7 0x50067f00 1342603008 > > r8 0xffffffffffffdfcc 18446744073709543372 > > r9 0x0 0 > > r10 0x0 0 > > r11 0x0 0 > > r12 0xffffffffffffdfd0 18446744073709543376 > > r13 0x50057010 1342533648 > > r14 0x0 0 > > r15 0x0 0 > > r16 0x50047f00 1342471936 > > r17 0x500613e0 1342575584 > > r18 0x50253388 1344615304 > > r19 0x2 2 > > r20 0x0 0 > > r21 0x9 9 > > r22 0x0 0 > > r23 0x40000000000000 18014398509481984 > > r24 0x5004a100 1342480640 > > r25 0x5004c400 1342489600 > > r26 0xffffffffffffcd18 18446744073709538584 > > r27 0xffffffffffffcd3c 18446744073709538620 > > r28 0xffffffffffffcd3c 18446744073709538620 > > r29 0x0 0 > > r30 0x10010428 268502056 > > r31 0xffffffffffffcbf0 18446744073709538288 > > pc 0x100104a8 0x100104a8 <.__do_global_ctors_aux+56> > > msr <unavailable> > > cr 0x48200c00 1210059776 > > lr 0x10010518 0x10010518 <._init+24> > > ctr 0x10010500 268502272 > > xer 0x20000000 536870912 > > (gdb) info file > > Symbols from "/root/c_tests/a.out". > > Native process: > > Using the running image of child LWP 100093 of process 1091. > > While running this, GDB does not access memory from... > > Local exec file: > > `/root/c_tests/a.out', file type elf64-powerpc-freebsd. > > Entry point: 0x100300a0 > > 0x0000000010000270 - 0x0000000010000285 is .interp > > 0x0000000010000288 - 0x00000000100002b8 is .note.tag > > 0x00000000100002b8 - 0x00000000100002b9 is .rodata > > 0x00000000100002bc - 0x00000000100002bc is .eh_frame > > 0x00000000100002c0 - 0x0000000010000368 is .dynsym > > 0x0000000010000368 - 0x0000000010000376 is .gnu.version > > 0x0000000010000378 - 0x0000000010000398 is .gnu.version_r > > 0x0000000010000398 - 0x00000000100003d8 is .hash > > 0x00000000100003d8 - 0x000000001000041a is .dynstr > > 0x0000000010000420 - 0x0000000010000468 is .rela.plt > > 0x0000000010000468 - 0x0000000010000474 is .eh_frame_hdr > > 0x0000000010010000 - 0x00000000100104f8 is .text > > 0x0000000010010500 - 0x000000001001052c is .init > > 0x0000000010010530 - 0x0000000010010554 is .fini > > 0x0000000010010560 - 0x00000000100105c0 is .plt > > 0x0000000010020000 - 0x0000000010020010 is .ctors > > 0x0000000010020010 - 0x0000000010020020 is .dtors > > 0x0000000010020020 - 0x0000000010020028 is .jcr > > 0x0000000010020028 - 0x0000000010020138 is .dynamic > > 0x0000000010020138 - 0x0000000010020138 is .got > > 0x0000000010030000 - 0x0000000010030019 is .data > > 0x0000000010030020 - 0x0000000010030050 is .got.plt > > 0x0000000010030050 - 0x00000000100300a0 is .toc > > 0x00000000100300a0 - 0x0000000010030160 is .opd > > 0x0000000010030160 - 0x0000000010030170 is .bss > > 0x0000000050020158 - 0x0000000050020228 is .hash in /libexec/ld-elf.so.1 > > 0x0000000050020228 - 0x0000000050020540 is .dynsym in /libexec/ld-elf.so.1 > > 0x0000000050020540 - 0x00000000500206b6 is .dynstr in /libexec/ld-elf.so.1 > > 0x00000000500206b6 - 0x00000000500206f8 is .gnu.version in /libexec/ld-elf.so.1 > > 0x00000000500206f8 - 0x0000000050020808 is .gnu.version_d in /libexec/ld-elf.so.1 > > 0x0000000050020808 - 0x0000000050027960 is .rela.dyn in /libexec/ld-elf.so.1 > > 0x0000000050027960 - 0x0000000050045a04 is .text in /libexec/ld-elf.so.1 > > 0x0000000050045a04 - 0x00000000500484a3 is .rodata in /libexec/ld-elf.so.1 > > 0x00000000500484a4 - 0x00000000500484a4 is .eh_frame in /libexec/ld-elf.so.1 > > 0x000000005005cf50 - 0x000000005005cf58 is .fini_array in /libexec/ld-elf.so.1 > > 0x000000005005cf58 - 0x000000005005d260 is .data.rel.ro in /libexec/ld-elf.so.1 > > 0x000000005005d260 - 0x000000005005d3b0 is .dynamic in /libexec/ld-elf.so.1 > > 0x000000005005d3b0 - 0x000000005005ff00 is .opd in /libexec/ld-elf.so.1 > > 0x000000005005ff00 - 0x000000005005ff08 is .got in /libexec/ld-elf.so.1 > > 0x0000000050060000 - 0x0000000050060628 is .data in /libexec/ld-elf.so.1 > > 0x0000000050060628 - 0x0000000050061478 is .bss in /libexec/ld-elf.so.1 > > 0x00000000500621c8 - 0x00000000500672b0 is .hash in /lib/libc.so.7 > > 0x00000000500672b0 - 0x0000000050079778 is .dynsym in /lib/libc.so.7 > > 0x0000000050079778 - 0x0000000050080846 is .dynstr in /lib/libc.so.7 > > 0x0000000050080846 - 0x00000000500820ac is .gnu.version in /lib/libc.so.7 > > 0x00000000500820b0 - 0x00000000500821c0 is .gnu.version_d in /lib/libc.so.7 > > 0x00000000500821c0 - 0x00000000500c2678 is .rela.dyn in /lib/libc.so.7 > > 0x00000000500c2678 - 0x00000000500c7868 is .rela.plt in /lib/libc.so.7 > > 0x00000000500c7870 - 0x00000000500c789c is .init in /lib/libc.so.7 > > 0x00000000500c78a0 - 0x0000000050227ca0 is .text in /lib/libc.so.7 > > 0x0000000050227ca0 - 0x0000000050227cc4 is .fini in /lib/libc.so.7 > > 0x0000000050227d00 - 0x000000005023b606 is .rodata in /lib/libc.so.7 > > 0x000000005023b608 - 0x000000005023b6ec is .eh_frame_hdr in /lib/libc.so.7 > > 0x000000005023b6f0 - 0x000000005023bad4 is .eh_frame in /lib/libc.so.7 > > 0x0000000050253318 - 0x0000000050253380 is .tdata in /lib/libc.so.7 > > 0x0000000050253380 - 0x0000000050253390 is .tbss in /lib/libc.so.7 > > 0x0000000050253380 - 0x0000000050253390 is .init_array in /lib/libc.so.7 > > 0x0000000050253390 - 0x0000000050253398 is .fini_array in /lib/libc.so.7 > > 0x0000000050253398 - 0x00000000502533a8 is .ctors in /lib/libc.so.7 > > 0x00000000502533a8 - 0x00000000502533b8 is .dtors in /lib/libc.so.7 > > 0x00000000502533b8 - 0x00000000502533c0 is .jcr in /lib/libc.so.7 > > 0x00000000502533c0 - 0x0000000050258a90 is .data.rel.ro in /lib/libc.so.7 > > 0x0000000050258a90 - 0x0000000050258c60 is .dynamic in /lib/libc.so.7 > > 0x0000000050258c60 - 0x000000005026f8f8 is .opd in /lib/libc.so.7 > > 0x000000005026f900 - 0x0000000050271f98 is .got in /lib/libc.so.7 > > 0x0000000050272000 - 0x0000000050277208 is .plt in /lib/libc.so.7 > > 0x0000000050277208 - 0x000000005027b0b0 is .data in /lib/libc.so.7 > > 0x000000005027b0b0 - 0x0000000050294738 is .bss in /lib/libc.so.7 > > > > > > === > > Mark Millard > > markmi at dsl-only.net > > > > On 2017-Jan-17, at 1:56 PM, Roman Divacky <rdivacky at vlakno.cz> wrote: > > > >> Go with Out. > >> > >> On Tue, Jan 17, 2017 at 01:53:14PM -0800, Mark Millard wrote: > >>> On 2017-Jan-17, at 11:54 AM, Roman Divacky <rdivacky at vlakno.cz> wrote: > >>> > >>> . . . > >>>> I wonder if it doesnt work because of my first patch (the one to turn GOT > >>>> reloc into PLT one). > >>>> > >>>> LLD understands that we use GOT as TOC (which was true before my patch), > >>>> I wonder if something like this: > >>>> > >>>> ndex: tools/lld/ELF/Target.cpp > >>>> =================================================================== > >>>> --- tools/lld/ELF/Target.cpp (revision 292071) > >>>> +++ tools/lld/ELF/Target.cpp (working copy) > >>>> @@ -1070,7 +1070,8 @@ > >>>> } > >>>> > >>>> PPC64TargetInfo::PPC64TargetInfo() { > >>>> - PltRel = GotRel = R_PPC64_GLOB_DAT; > >>>> + GotRel = R_PPC64_GLOB_DAT; > >>>> + PltRel = R_PPC64_JMP_SLOT; > >>>> RelativeRel = R_PPC64_RELATIVE; > >>>> GotEntrySize = 8; > >>>> GotPltEntrySize = 8; > >>>> @@ -1099,7 +1100,7 @@ > >>>> // TOC starts where the first of these sections starts. We always create a > >>>> // .got when we see a relocation that uses it, so for us the start is always > >>>> // the .got. > >>>> - uint64_t TocVA = In<ELF64BE>::Got->getVA(); > >>>> + uint64_t TocVA = In<ELF64BE>::Plt->getVA(); > >>>> > >>>> // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000 > >>>> // thus permitting a full 64 Kbytes segment. Note that the glibc startup > >>> > >>> The modern 3.9.1 source does not match for the last. Note the > >>> "Out" vs. "In" below ("svnlite status" does not show my source > >>> as different in this area): > >>> > >>> uint64_t getPPC64TocBase() { > >>> // The TOC consists of sections .got, .toc, .tocbss, .plt in that order. The > >>> // TOC starts where the first of these sections starts. We always create a > >>> // .got when we see a relocation that uses it, so for us the start is always > >>> // the .got. > >>> uint64_t TocVA = Out<ELF64BE>::Got->getVA(); > >>> > >>> // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000 > >>> // thus permitting a full 64 Kbytes segment. Note that the glibc startup > >>> // code (crt1.o) assumes that you can get from the TOC base to the > >>> // start of the .toc section with only a single (signed) 16-bit relocation. > >>> return TocVA + PPC64TocOffset; > >>> } > >>> > >>> [Also the "// TOC . . ." comment is at line 1005 (given the prior > >>> GotRel vs. PltRel split into separate lines).] > >>> > >>> Which should I use?: In vs. Out > >>> > >>>> would make any difference? It's not correct but might shed some light on what needs to be done > >>>> if I am right. > >>> > >>> Separately if I understand the change you are picking out which section > >>> is first of .got, .toc, .tocbss, .plt (.got.plt as well?). But for the > >>> order of things that would still make the .ctors, .dtors, .jcr, .dynamic, > >>> and .data sections as being inside the TOC and taking TOC address range > >>> space: > >>> > >>> 0x0000000010010560 - 0x00000000100105c0 is .plt <<<<<===== NOTE!!!! > >>> 0x0000000010020000 - 0x0000000010020010 is .ctors > >>> 0x0000000010020010 - 0x0000000010020020 is .dtors > >>> 0x0000000010020020 - 0x0000000010020028 is .jcr > >>> 0x0000000010020028 - 0x0000000010020138 is .dynamic > >>> 0x0000000010020138 - 0x0000000010020138 is .got <<<<<===== NOTE!!!! > >>> 0x0000000010030000 - 0x0000000010030019 is .data > >>> 0x0000000010030020 - 0x0000000010030050 is .got.plt <<<<<===== NOTE!!!! > >>> 0x0000000010030050 - 0x00000000100300a0 is .toc <<<<<===== NOTE!!!! > >>> > >>> Is that expected/desired/allowed? > >>> > >>>> Could you explore this please? > >>> > >>> After you report for sure for In vs. Out I'll take a stab > >>> at it. > >>> > >>> === > >>> Mark Millard > >>> markmi at dsl-only.net > > _______________________________________________ > freebsd-toolchain@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain > To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe@freebsd.org" > > _______________________________________________ > freebsd-toolchain@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain > To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe@freebsd.org" > > _______________________________________________ > freebsd-toolchain@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain > To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe@freebsd.org"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170119200530.GA58089>