On 02.03.2016 18:55, Borislav Petkov wrote: > On Wed, Mar 02, 2016 at 06:38:15PM +0200, Mika Penttilä wrote: >> I actually looked at it a while too... >> >> The >> movq stack_start - __START_KERNEL_map, %rsp >> >> turns into (objdump disassembly) >> >> mov 0x0,%rsp >> >> with relocation >> 0000000000000004 R_X86_64_32S stack_start+0x0000000080000000 >> >> Now stack_start is at ffffffff81ef3380, so the relocation gives 1ef3380 >> which would be correct, so why the >> second subq ? >> >> You may explain :) > Here it is :-) > > $ readelf -a vmlinux | grep stack_start > 70526: ffffffff81cbabf8 0 NOTYPE GLOBAL DEFAULT 14 stack_start > > 0xffffffff81cbabf8 - __START_KERNEL_map = > 0xffffffff81cbabf8 - 0xffffffff80000000 = > 0x1cbabf8 > > (gdb) x/x 0x1cbabf8 > 0x1cbabf8: 0xffffffff81c03ff8 > > (You don't need gdb for that - you can hexdump or objdump vmlinux). > > Now stack_start is: > > GLOBAL(stack_start) > .quad init_thread_union+THREAD_SIZE-8 > > which is > > $ readelf -a vmlinux | grep init_thread_union > 82491: ffffffff81c00000 16384 OBJECT GLOBAL DEFAULT 14 init_thread_union > > so init_thread_union+THREAD_SIZE-8 = 0xffffffff81c00000 + 4*4096-8 = > 0xffffffff81c03ff8 > > So you have to subtract __START_KERNEL_map again because it has there a > virtual address and we haven't enabled paging yet: > > 0xffffffff81c03ff8 - 0xffffffff80000000 = 0x1c03ff8. > > Makes sense? > Ah missed completely that stack_start is effectively a pointer to stack..
Thanks, Mika