This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: PATCH: Replace @PLT with @GOTPCREL(%rip) in call
- From: Roland McGrath <roland at hack dot frob dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: GNU C Library <libc-alpha at sourceware dot org>
- Date: Thu, 3 Mar 2016 16:03:23 -0800 (PST)
- Subject: Re: PATCH: Replace @PLT with @GOTPCREL(%rip) in call
- Authentication-results: sourceware.org; auth=none
- References: <20160303132054 dot GA3822 at intel dot com>
> --- 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