diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-03-04 15:28:59 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-03-04 16:15:41 -0800 |
commit | 21683b5a7d9b8460e120e061f66a6ad84fa47e98 (patch) | |
tree | 213f6c1b6e68e9e4ff61eb76055925b0759476dd | |
parent | 684ce7e0fc57830ff7c5909e5794f571631ee83f (diff) | |
download | glibc-21683b5a7d9b8460e120e061f66a6ad84fa47e98.tar.gz glibc-21683b5a7d9b8460e120e061f66a6ad84fa47e98.tar.xz glibc-21683b5a7d9b8460e120e061f66a6ad84fa47e98.zip |
Replace @PLT with @GOTPCREL(%rip) in call
Since __libc_start_main is called very early, lazy binding isn't relevant here. Use indirect branch via GOT to avoid extra branch to PLT slot. [BZ #19745] * sysdeps/x86_64/start.S (_start): __libc_start_main@PLT with *__libc_start_main@GOTPCREL(%rip) in call.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | sysdeps/x86_64/start.S | 6 |
2 files changed, 10 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index 143d4a65bc..af555291a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-03-04 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #19745] + * sysdeps/x86_64/start.S (_start): Replace __libc_start_main@PLT + with *__libc_start_main@GOTPCREL(%rip) in call. + 2016-03-04 Roland McGrath <roland@hack.frob.com> * Makefile (tests-special): Add $(objpfx)c++-types-check.out only diff --git a/sysdeps/x86_64/start.S b/sysdeps/x86_64/start.S index 1374974307..2369b69ec3 100644 --- a/sysdeps/x86_64/start.S +++ b/sysdeps/x86_64/start.S @@ -104,8 +104,10 @@ ENTRY (_start) mov main@GOTPCREL(%rip), %RDI_LP /* Call the user's main function, and exit with its value. - But let the libc call main. */ - call __libc_start_main@PLT + But let the libc call main. Since __libc_start_main is + called very early, lazy binding isn't relevant here. Use + indirect branch via GOT to avoid extra branch to PLT slot. */ + call *__libc_start_main@GOTPCREL(%rip) #else /* Pass address of our own entry points to .fini and .init. */ mov $__libc_csu_fini, %R8_LP |