mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Don't use broken DL_AUTO_FUNCTION_ADDRESS()
On hppa and ia64, the macro DL_AUTO_FUNCTION_ADDRESS() uses the variable fptr[2] in it's own scope. The content of fptr[] is thus undefined right after the macro exits. Newer gcc's (>= 4.7) reuse the stack space of this variable triggering a segmentation fault in dl-init.c:69. To fix this we rewrite the macros to make the call directly to init and fini without needing to pass back a constructed function pointer.
This commit is contained in:
committed by
Carlos O'Donell
parent
d33cafadfe
commit
daf75146de
@ -61,13 +61,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
|
||||
- the others in the DT_INIT_ARRAY.
|
||||
*/
|
||||
if (l->l_info[DT_INIT] != NULL)
|
||||
{
|
||||
init_t init = (init_t) DL_DT_INIT_ADDRESS
|
||||
(l, l->l_addr + l->l_info[DT_INIT]->d_un.d_ptr);
|
||||
|
||||
/* Call the function. */
|
||||
init (argc, argv, env);
|
||||
}
|
||||
DL_CALL_DT_INIT(l, l->l_addr + l->l_info[DT_INIT]->d_un.d_ptr, argc, argv, env);
|
||||
|
||||
/* Next see whether there is an array with initialization functions. */
|
||||
ElfW(Dyn) *init_array = l->l_info[DT_INIT_ARRAY];
|
||||
|
Reference in New Issue
Block a user