Submitter | H.J. Lu |
---|---|
Date | March 3, 2016, 1:20 p.m. |
Message ID | <20160303132054.GA3822@intel.com> |
Download | mbox | patch |
Permalink | /patch/11173/ |
State | New |
Headers | show |
Comments
> --- a/sysdeps/x86_64/crti.S > +++ b/sysdeps/x86_64/crti.S > @@ -66,7 +66,7 @@ _init: > movq PREINIT_FUNCTION@GOTPCREL(%rip), %rax > testq %rax, %rax > je .Lno_weak_fn > - call PREINIT_FUNCTION@PLT > + call *PREINIT_FUNCTION@GOTPCREL(%rip) Can't this just be "call *%rax"? > --- a/sysdeps/x86_64/start.S > +++ b/sysdeps/x86_64/start.S > @@ -105,7 +105,7 @@ ENTRY (_start) > > /* Call the user's main function, and exit with its value. > But let the libc call main. */ > - call __libc_start_main@PLT > + call *__libc_start_main@GOTPCREL(%rip) > #else > /* Pass address of our own entry points to .fini and .init. */ > mov $__libc_csu_fini, %R8_LP In the general case, foo@PLT is preferable to foo@GOTPCREL(%rip) because it allows for lazy resolution. That's not worthwhile here because _start is presumably always run and run very early. But it merits a comment saying why it's not following the normal pattern for PIC calls. Thanks, Roland
Patch
diff --git a/sysdeps/x86_64/crti.S b/sysdeps/x86_64/crti.S index a345259..3dff141 100644 --- a/sysdeps/x86_64/crti.S +++ b/sysdeps/x86_64/crti.S @@ -66,7 +66,7 @@ _init: movq PREINIT_FUNCTION@GOTPCREL(%rip), %rax testq %rax, %rax je .Lno_weak_fn - call PREINIT_FUNCTION@PLT + call *PREINIT_FUNCTION@GOTPCREL(%rip) .Lno_weak_fn: #else call PREINIT_FUNCTION diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S index 1374974..22b18ae 100644 --- a/sysdeps/x86_64/start.S +++ b/sysdeps/x86_64/start.S @@ -105,7 +105,7 @@ ENTRY (_start) /* Call the user's main function, and exit with its value. But let the libc call main. */ - call __libc_start_main@PLT + call *__libc_start_main@GOTPCREL(%rip) #else /* Pass address of our own entry points to .fini and .init. */ mov $__libc_csu_fini, %R8_LP