mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
dacc8ffa42
2000-03-30 Ulrich Drepper <drepper@redhat.com> Implement dynamic determination of constructor/destructor order in the dynamic linker. * elf/Versions [ld.so] (GLIBC_2.0): Remove _dl_init_next. (GLIBC_2.2): Add _dl_init. * elf/dl-close.c: Also call all destructors in FINI_ARRAY. r_duplist is not anymore allocated separately. l_initfini is and therefore free it if necessary. * elf/dl-deps.c: If a searchlist has to be allocated, put all in one malloc block. Otherwise allocate l_initfini list only. Put dependencies for the object in l_initfini list. Sort dependencies for the object to be loaded topologically. * elf/dl-fini.c: Before running the destructors sort the topologically. * elf/dl-init.c (_dl_init): Renamed from _dl_init_next. Rewrite to call constructors instead of iterating over the pointers. Get list of objects for which to run constructors from l_initfini element. Accept argc, argv, and env as parameters and pass them to the constructors. * elf/ld-load.c (_dl_map_object_from_fd): Initialize l_ldnum member with size of dynamic section. * elf/dl-open.c (dl_open_worker): Only call _dl_init instead of _dl_init_next and calling constructors ourself. * elf/dl-preinit.c (_dl_preinit): Renamed from _dl_preinit_next. Take argc, argv, and env as parameters and pass them to the constructors. Rewrite to call all constructors and not iterate over the pointers. * elf/dynamic-link.h: Don't relocate DT_FINI_ARRAY entry. Don't precompute l_initcount and l_preinitcount. * elf/link.h (struct link_map): Add l_ldnum member. Make l_phdr_allocated part of the bitfield. Remove l_runcount, l_initcount, and l_preinitcount. Add l_initfini. * sysdeps/generic/ldsodefs.h: Replace _dl_init_next prototype with one for _dl_init. * sysdeps/i386/dl-machine (RTLD_START): Rewrite to match new init function interface. * sysdeps/unix/sysv/linux/init-first.h: Removed. * sysdeps/unix/sysv/linux/Dist: Delete file here as well. * sysdeps/unix/sysv/linux/init-first.c [PIC]: Don't use SYSDEP_CALL_INIT. Make _init a strong alias of init. The calling conventions now match. * sysdeps/generic/libc-start.c: Calling __libc_init_first has no effect for shared objects. Don't emit message and call only for static library.
55 lines
1.5 KiB
Plaintext
55 lines
1.5 KiB
Plaintext
libc {
|
|
GLIBC_2.0 {
|
|
# functions used in other libraries
|
|
_dl_open; _dl_close; _dl_addr;
|
|
}
|
|
GLIBC_2.1 {
|
|
# functions used in other libraries
|
|
_dl_mcount_wrapper; _dl_mcount_wrapper_check;
|
|
}
|
|
GLIBC_2.2 {
|
|
# functions used in other libraries
|
|
_dl_sym; _dl_vsym;
|
|
}
|
|
}
|
|
|
|
ld.so {
|
|
GLIBC_2.0 {
|
|
# global variables
|
|
_dl_debug_impcalls; _dl_debug_fd;
|
|
|
|
# Those are in the dynamic linker, but used by libc.so.
|
|
__libc_enable_secure; _dl_catch_error; _dl_check_all_versions;
|
|
_dl_debug_initialize; _dl_debug_state; _dl_default_scope;
|
|
_dl_global_scope_end; _dl_lookup_symbol;
|
|
_dl_map_object; _dl_map_object_deps; _dl_object_relocation_scope;
|
|
_dl_relocate_object; _dl_signal_error; _dl_starting_up;
|
|
_dl_sysdep_start; _r_debug;
|
|
_dl_global_scope; _dl_lookup_symbol_skip;
|
|
_dl_lookup_versioned_symbol; _dl_lookup_versioned_symbol_skip;
|
|
_dl_debug_message;
|
|
|
|
# Function from libc.so which must be shared with libc.
|
|
calloc; free; malloc; realloc;
|
|
}
|
|
GLIBC_2.1 {
|
|
# global variables
|
|
_dl_profile; _dl_profile_map; _dl_profile_output; _dl_start_profile;
|
|
_dl_loaded; _dl_main_searchlist; _dl_fpu_control; _dl_initial_searchlist;
|
|
_dl_global_scope_alloc; __libc_stack_end;
|
|
|
|
# functions used in other libraries
|
|
_dl_mcount; _dl_unload_cache;
|
|
}
|
|
GLIBC_2.1.1 {
|
|
# global variables
|
|
_dl_lazy; _dl_origin_path; _dl_platformlen;
|
|
|
|
# functions used in other libraries
|
|
_dl_dst_count; _dl_dst_substitute;
|
|
}
|
|
GLIBC_2.2 {
|
|
_dl_preinit_next; _dl_init;
|
|
}
|
|
}
|