mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-26 06:50:07 +00:00
Update.
* sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for all the files which use CURRENT_STACK_FRAME.
This commit is contained in:
parent
b721a2c03c
commit
b775be640a
@ -1,5 +1,8 @@
|
|||||||
2001-04-12 Ulrich Drepper <drepper@redhat.com>
|
2001-04-12 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/i386/Makefile: Make sure gcc uses a frame pointer for
|
||||||
|
all the files which use CURRENT_STACK_FRAME.
|
||||||
|
|
||||||
* sysdeps/i386/pt-machine.h (CURRENT_STACK_FRAME): Define using
|
* sysdeps/i386/pt-machine.h (CURRENT_STACK_FRAME): Define using
|
||||||
__builtin_frame_address.
|
__builtin_frame_address.
|
||||||
* sysdeps/i386/i686/pt-machine.h: Likewise.
|
* sysdeps/i386/i686/pt-machine.h: Likewise.
|
||||||
|
@ -2,4 +2,17 @@ ifeq ($(subdir),linuxthreads)
|
|||||||
# On i686 we must avoid generating the trampoline functions generated
|
# On i686 we must avoid generating the trampoline functions generated
|
||||||
# to get the GOT pointer.
|
# to get the GOT pointer.
|
||||||
CFLAGS-pt-initfini.s += -march=i386 -mcpu=i386
|
CFLAGS-pt-initfini.s += -march=i386 -mcpu=i386
|
||||||
|
|
||||||
|
# Most files must not be compiled without frame pointer since we need
|
||||||
|
# the frame base address which is stored in %ebp unless the frame pointer
|
||||||
|
# is optimized out.
|
||||||
|
CFLAGS-cancel.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-condvar.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-join.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-manager.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-oldsemaphore.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-pthreads.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-ptlongjmp.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-semaphore.c += -fno-omit-frame-pointer
|
||||||
|
CFLAGS-signals.c += -fno-omit-frame-pointer
|
||||||
endif
|
endif
|
||||||
|
@ -49,19 +49,37 @@ elf_machine_dynamic (void)
|
|||||||
static inline Elf64_Addr
|
static inline Elf64_Addr
|
||||||
elf_machine_load_address (void)
|
elf_machine_load_address (void)
|
||||||
{
|
{
|
||||||
register Elf64_Addr elf_pic_register __asm__("%l7");
|
register Elf64_Addr *elf_pic_register __asm__("%l7");
|
||||||
Elf64_Addr pc, la;
|
|
||||||
|
|
||||||
/* Utilize the fact that a local .got entry will be partially
|
/* We used to utilize the fact that a local .got entry will
|
||||||
initialized at startup awaiting its RELATIVE fixup. */
|
be partially initialized at startup awaiting its RELATIVE
|
||||||
|
fixup:
|
||||||
|
|
||||||
__asm("sethi %%hi(.Load_address), %1\n"
|
Elf64_Addr pc, la;
|
||||||
".Load_address:\n\t"
|
|
||||||
"rd %%pc, %0\n\t"
|
|
||||||
"or %1, %%lo(.Load_address), %1\n\t"
|
|
||||||
: "=r"(pc), "=r"(la));
|
|
||||||
|
|
||||||
return pc - *(Elf64_Addr *)(elf_pic_register + la);
|
__asm("sethi %%hi(.Load_address), %1\n"
|
||||||
|
".Load_address:\n\t"
|
||||||
|
"rd %%pc, %0\n\t"
|
||||||
|
"or %1, %%lo(.Load_address), %1\n\t"
|
||||||
|
: "=r"(pc), "=r"(la));
|
||||||
|
|
||||||
|
return pc - *(Elf64_Addr *)(elf_pic_register + la);
|
||||||
|
|
||||||
|
Unfortunately as binutils tries to work around Solaris
|
||||||
|
dynamic linker bug which resolves R_SPARC_RELATIVE as X += B + A
|
||||||
|
instead of X = B + A this does not work any longer, since ld
|
||||||
|
clears it.
|
||||||
|
|
||||||
|
The following method relies on the fact that sparcv9 ABI maximal
|
||||||
|
page length is 1MB and all ELF segments on sparc64 are aligned
|
||||||
|
to 1MB. Also, it relies on _DYNAMIC coming after _GLOBAL_OFFSET_TABLE_
|
||||||
|
and assumes that they both fit into the first 1MB of the RW segment.
|
||||||
|
This should be true for some time unless ld.so grows too much, at the
|
||||||
|
moment the whole stripped ld.so is 128KB and only smaller part of that
|
||||||
|
is in the RW segment. */
|
||||||
|
|
||||||
|
return ((Elf64_Addr)elf_pic_register - *elf_pic_register + 0xfffff)
|
||||||
|
& ~0xfffffUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We have 4 cases to handle. And we code different code sequences
|
/* We have 4 cases to handle. And we code different code sequences
|
||||||
|
Loading…
Reference in New Issue
Block a user