mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
2002-03-01 Ulrich Drepper <drepper@redhat.com> * elf/Makefile (dl-routines): Add dl-origin. (elide-routines.os): Add dl-origin. * elf/Versions [ld] (GLIBC_PRIVATE): Add _dl_get_origin. * elf/dl-debug.c (_dl_debug_initialize): Add missing INTUSE around _dl_debug_state. * include/libc-symbols.c: Define attribute_hidden depending on HAVE_VISIBILITY_ATTRIBUTE. Add definition of INTVARDEF. * elf/dl-deps.c: Use INTUSE with __libc_enable_secure. * elf/dl-load.c: Likewise. * elf/rtld.c: Likewise. * include/unistd.h: Declare __libc_enable_secure_internal. * sysdeps/generic/dl-sysdep.c: Use INTVARDEF with __libc_enable_secure. Use INTUSE with __libc_enable_secure. * sysdeps/mach/hurd/dl-sysdep.c: Likewise. * elf/dl-deps.c: Use INTUSE with _dl_out_of_memory. * elf/dl-error.c: Likewise, * sysdeps/generic/ldsodefs.h: Declare _dl_out_of_memory_internal. * elf/dl-dst.h [_RTLD_GLOBAL]: Define _dl_get_origin to use INTUSE. * sysdeps/generic/dl-origin.c: Undefine _dl_get_origin macro before function definition. Use INTDEF with _dl_get_origin. * sysdeps/unix/sysv/linux/dl-origin.c: Likewise. * elf/dl-init.c: Use INTUSE with _dl_starting_up. * elf/rtld.c: Likewise. Use INTVARDEF for _dl_starting_up. * elf/dl-profile.c: Use INTDEF for _dl_mcount. * elf/dl-runtime.c: Use INTUSE with _dl_mcount. * sysdeps/generic/ldsodefs.h: Declare _dl_mcount_internal. * elf/dl-conflict.c: Use rtld_progrname instead of _dl_argv[0]. * elf/dl-deps.c: Likewise. * elf/dl-error.c: Likewise. * elf/dl-fini.c: Likewise. * elf/dl-init.c: Likewise. * elf/dl-load.c: Likewise. * elf/dl-lookup.c: Likewise. * elf/dl-reloc.c: Likewise. * elf/dl-version.c: Likewise. * elf/do-lookup.h: Likewise. * sysdeps/arm/dl-machine.h: Likewise. * sysdeps/cris/dl-machine.h: Likewise. * sysdeps/hppa/dl-machine.h: Likewise. * sysdeps/i386/dl-machine.h: Likewise. * sysdeps/m68k/dl-machine.h: Likewise. * sysdeps/powerpc/dl-machine.h: Likewise. * sysdeps/s390/s390-32/dl-machine.h: Likewise. * sysdeps/s390/s390-64/dl-machine.h: Likewise. * sysdeps/sh/dl-machine.h: Likewise. * sysdeps/sparc/sparc-32/dl-machine.h: Likewise. * sysdeps/sparc/sparc-64/dl-machine.h: Likewise. * sysdeps/x86_64/dl-machine.h: Likewise. * elf/rtld.c: Use INTDEF for _dl_argv. Use rtld_progrname instead of _dl_argv[0]. Use INTUSE with _dl_argv. * sysdeps/generic/dl-sysdep.c: Use INTUSE with _dl_argv. * sysdeps/generic/ldsodefs.h: Define rtld_progname macro.
This commit is contained in:
61
ChangeLog
61
ChangeLog
@ -1,3 +1,64 @@
|
|||||||
|
2002-03-01 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* elf/Makefile (dl-routines): Add dl-origin.
|
||||||
|
(elide-routines.os): Add dl-origin.
|
||||||
|
* elf/Versions [ld] (GLIBC_PRIVATE): Add _dl_get_origin.
|
||||||
|
* elf/dl-debug.c (_dl_debug_initialize): Add missing INTUSE around
|
||||||
|
_dl_debug_state.
|
||||||
|
* include/libc-symbols.c: Define attribute_hidden depending on
|
||||||
|
HAVE_VISIBILITY_ATTRIBUTE. Add definition of INTVARDEF.
|
||||||
|
|
||||||
|
* elf/dl-deps.c: Use INTUSE with __libc_enable_secure.
|
||||||
|
* elf/dl-load.c: Likewise.
|
||||||
|
* elf/rtld.c: Likewise.
|
||||||
|
* include/unistd.h: Declare __libc_enable_secure_internal.
|
||||||
|
* sysdeps/generic/dl-sysdep.c: Use INTVARDEF with __libc_enable_secure.
|
||||||
|
Use INTUSE with __libc_enable_secure.
|
||||||
|
* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
|
||||||
|
|
||||||
|
* elf/dl-deps.c: Use INTUSE with _dl_out_of_memory.
|
||||||
|
* elf/dl-error.c: Likewise,
|
||||||
|
* sysdeps/generic/ldsodefs.h: Declare _dl_out_of_memory_internal.
|
||||||
|
|
||||||
|
* elf/dl-dst.h [_RTLD_GLOBAL]: Define _dl_get_origin to use INTUSE.
|
||||||
|
* sysdeps/generic/dl-origin.c: Undefine _dl_get_origin macro before
|
||||||
|
function definition. Use INTDEF with _dl_get_origin.
|
||||||
|
* sysdeps/unix/sysv/linux/dl-origin.c: Likewise.
|
||||||
|
|
||||||
|
* elf/dl-init.c: Use INTUSE with _dl_starting_up.
|
||||||
|
* elf/rtld.c: Likewise. Use INTVARDEF for _dl_starting_up.
|
||||||
|
|
||||||
|
* elf/dl-profile.c: Use INTDEF for _dl_mcount.
|
||||||
|
* elf/dl-runtime.c: Use INTUSE with _dl_mcount.
|
||||||
|
* sysdeps/generic/ldsodefs.h: Declare _dl_mcount_internal.
|
||||||
|
|
||||||
|
* elf/dl-conflict.c: Use rtld_progrname instead of _dl_argv[0].
|
||||||
|
* elf/dl-deps.c: Likewise.
|
||||||
|
* elf/dl-error.c: Likewise.
|
||||||
|
* elf/dl-fini.c: Likewise.
|
||||||
|
* elf/dl-init.c: Likewise.
|
||||||
|
* elf/dl-load.c: Likewise.
|
||||||
|
* elf/dl-lookup.c: Likewise.
|
||||||
|
* elf/dl-reloc.c: Likewise.
|
||||||
|
* elf/dl-version.c: Likewise.
|
||||||
|
* elf/do-lookup.h: Likewise.
|
||||||
|
* sysdeps/arm/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/cris/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/hppa/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/i386/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/m68k/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/powerpc/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/s390/s390-64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sh/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc-32/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/sparc/sparc-64/dl-machine.h: Likewise.
|
||||||
|
* sysdeps/x86_64/dl-machine.h: Likewise.
|
||||||
|
* elf/rtld.c: Use INTDEF for _dl_argv. Use rtld_progrname instead of
|
||||||
|
_dl_argv[0]. Use INTUSE with _dl_argv.
|
||||||
|
* sysdeps/generic/dl-sysdep.c: Use INTUSE with _dl_argv.
|
||||||
|
* sysdeps/generic/ldsodefs.h: Define rtld_progname macro.
|
||||||
|
|
||||||
2002-02-28 Jakub Jelinek <jakub@redhat.com>
|
2002-02-28 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* elf/rtld.c (_rtld_global): Remove .protected.
|
* elf/rtld.c (_rtld_global): Remove .protected.
|
||||||
|
@ -29,11 +29,11 @@ routines = $(dl-routines) dl-open dl-close dl-support dl-iteratephdr \
|
|||||||
# profiled libraries.
|
# profiled libraries.
|
||||||
dl-routines = $(addprefix dl-,load cache lookup object reloc deps \
|
dl-routines = $(addprefix dl-,load cache lookup object reloc deps \
|
||||||
runtime error init fini debug misc \
|
runtime error init fini debug misc \
|
||||||
version profile conflict tls)
|
version profile conflict tls origin)
|
||||||
all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
|
all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
|
||||||
# But they are absent from the shared libc, because that code is in ld.so.
|
# But they are absent from the shared libc, because that code is in ld.so.
|
||||||
elide-routines.os = $(all-dl-routines) dl-support enbl-secure \
|
elide-routines.os = $(all-dl-routines) dl-support enbl-secure \
|
||||||
dl-iteratephdr-static
|
dl-iteratephdr-static dl-origin
|
||||||
|
|
||||||
# ld.so uses those routines, plus some special stuff for being the program
|
# ld.so uses those routines, plus some special stuff for being the program
|
||||||
# interpreter and operating independent of libc.
|
# interpreter and operating independent of libc.
|
||||||
|
@ -50,5 +50,6 @@ ld {
|
|||||||
_dl_relocate_object; _dl_signal_error; _dl_start_profile; _dl_starting_up;
|
_dl_relocate_object; _dl_signal_error; _dl_start_profile; _dl_starting_up;
|
||||||
_dl_unload_cache;
|
_dl_unload_cache;
|
||||||
_rtld_global; _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls;
|
_rtld_global; _dl_tls_symaddr; _dl_allocate_tls; _dl_deallocate_tls;
|
||||||
|
_dl_get_origin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
|
|||||||
{
|
{
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||||
_dl_printf ("\nconflict processing: %s\n",
|
_dl_printf ("\nconflict processing: %s\n",
|
||||||
l->l_name[0] ? l->l_name : _dl_argv[0]);
|
l->l_name[0] ? l->l_name : rtld_progname);
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Do the conflict relocation of the object and library GOT and other
|
/* Do the conflict relocation of the object and library GOT and other
|
||||||
|
@ -40,7 +40,7 @@ _dl_debug_initialize (ElfW(Addr) ldbase)
|
|||||||
_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
|
_r_debug.r_version = 1 /* R_DEBUG_VERSION XXX */;
|
||||||
_r_debug.r_ldbase = ldbase;
|
_r_debug.r_ldbase = ldbase;
|
||||||
_r_debug.r_map = GL(dl_loaded);
|
_r_debug.r_map = GL(dl_loaded);
|
||||||
_r_debug.r_brk = (ElfW(Addr)) &_dl_debug_state;
|
_r_debug.r_brk = (ElfW(Addr)) &INTUSE(_dl_debug_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return &_r_debug;
|
return &_r_debug;
|
||||||
|
@ -107,7 +107,7 @@ struct list
|
|||||||
char *__newp; \
|
char *__newp; \
|
||||||
\
|
\
|
||||||
/* DST must not appear in SUID/SGID programs. */ \
|
/* DST must not appear in SUID/SGID programs. */ \
|
||||||
if (__libc_enable_secure) \
|
if (INTUSE(__libc_enable_secure)) \
|
||||||
INTUSE(_dl_signal_error) (0, __str, NULL, N_("\
|
INTUSE(_dl_signal_error) (0, __str, NULL, N_("\
|
||||||
DST not allowed in SUID/SGID programs")); \
|
DST not allowed in SUID/SGID programs")); \
|
||||||
\
|
\
|
||||||
@ -297,7 +297,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
" requested by file=%s\n",
|
" requested by file=%s\n",
|
||||||
name,
|
name,
|
||||||
l->l_name[0]
|
l->l_name[0]
|
||||||
? l->l_name : _dl_argv[0]);
|
? l->l_name : rtld_progname);
|
||||||
|
|
||||||
/* We must be prepared that the addressed shared
|
/* We must be prepared that the addressed shared
|
||||||
object is not available. */
|
object is not available. */
|
||||||
@ -307,7 +307,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
{
|
{
|
||||||
/* We are not interested in the error message. */
|
/* We are not interested in the error message. */
|
||||||
assert (errstring != NULL);
|
assert (errstring != NULL);
|
||||||
if (errstring != _dl_out_of_memory)
|
if (errstring != INTUSE(_dl_out_of_memory))
|
||||||
free ((char *) errstring);
|
free ((char *) errstring);
|
||||||
|
|
||||||
/* Simply ignore this error and continue the work. */
|
/* Simply ignore this error and continue the work. */
|
||||||
@ -325,7 +325,7 @@ _dl_map_object_deps (struct link_map *map,
|
|||||||
" requested by file=%s\n",
|
" requested by file=%s\n",
|
||||||
name,
|
name,
|
||||||
l->l_name[0]
|
l->l_name[0]
|
||||||
? l->l_name : _dl_argv[0]);
|
? l->l_name : rtld_progname);
|
||||||
|
|
||||||
/* For filter objects the dependency must be available. */
|
/* For filter objects the dependency must be available. */
|
||||||
err = INTUSE(_dl_catch_error) (&objname, &errstring,
|
err = INTUSE(_dl_catch_error) (&objname, &errstring,
|
||||||
|
@ -62,6 +62,11 @@ extern size_t _dl_dst_count_internal (const char *name, int is_path);
|
|||||||
|
|
||||||
/* Find origin of the executable. */
|
/* Find origin of the executable. */
|
||||||
extern const char *_dl_get_origin (void);
|
extern const char *_dl_get_origin (void);
|
||||||
|
extern const char *_dl_get_origin_internal (void);
|
||||||
|
|
||||||
|
#ifdef _RTLD_LOCAL
|
||||||
|
# define _dl_get_origin INTUSE(_dl_get_origin)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Prototype for used function. */
|
/* Prototype for used function. */
|
||||||
extern char *_dl_dst_substitute (struct link_map *l, const char *name,
|
extern char *_dl_dst_substitute (struct link_map *l, const char *name,
|
||||||
|
@ -49,6 +49,7 @@ __libc_tsd_define (static, DL_ERROR)
|
|||||||
variable since we have to avoid freeing it and so have to enable
|
variable since we have to avoid freeing it and so have to enable
|
||||||
a pointer comparison. See below and in dlfcn/dlerror.c. */
|
a pointer comparison. See below and in dlfcn/dlerror.c. */
|
||||||
const char _dl_out_of_memory[] = "out of memory";
|
const char _dl_out_of_memory[] = "out of memory";
|
||||||
|
INTVARDEF(_dl_out_of_memory)
|
||||||
|
|
||||||
|
|
||||||
/* This points to a function which is called when an continuable error is
|
/* This points to a function which is called when an continuable error is
|
||||||
@ -92,7 +93,7 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
|
|||||||
{
|
{
|
||||||
/* This is better than nothing. */
|
/* This is better than nothing. */
|
||||||
lcatch->objname = "";
|
lcatch->objname = "";
|
||||||
lcatch->errstring = _dl_out_of_memory;
|
lcatch->errstring = INTUSE(_dl_out_of_memory);
|
||||||
}
|
}
|
||||||
longjmp (lcatch->env, errcode ?: -1);
|
longjmp (lcatch->env, errcode ?: -1);
|
||||||
}
|
}
|
||||||
@ -101,7 +102,7 @@ _dl_signal_error (int errcode, const char *objname, const char *occation,
|
|||||||
/* Lossage while resolving the program's own symbols is always fatal. */
|
/* Lossage while resolving the program's own symbols is always fatal. */
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
_dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
|
_dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
occation ?: N_("error while loading shared libraries"),
|
occation ?: N_("error while loading shared libraries"),
|
||||||
objname, *objname ? ": " : "",
|
objname, *objname ? ": " : "",
|
||||||
errstring, errcode ? ": " : "",
|
errstring, errcode ? ": " : "",
|
||||||
|
@ -148,7 +148,8 @@ _dl_fini (void)
|
|||||||
/* When debugging print a message first. */
|
/* When debugging print a message first. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling fini: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling fini: %s\n\n",
|
||||||
l->l_name[0] ? l->l_name : _dl_argv[0]);
|
l->l_name[0]
|
||||||
|
? l->l_name : rtld_progname);
|
||||||
|
|
||||||
/* First see whether an array is given. */
|
/* First see whether an array is given. */
|
||||||
if (l->l_info[DT_FINI_ARRAY] != NULL)
|
if (l->l_info[DT_FINI_ARRAY] != NULL)
|
||||||
|
@ -26,6 +26,7 @@ typedef void (*init_t) (int, char **, char **);
|
|||||||
|
|
||||||
/* Flag, nonzero during startup phase. */
|
/* Flag, nonzero during startup phase. */
|
||||||
extern int _dl_starting_up;
|
extern int _dl_starting_up;
|
||||||
|
extern int _dl_starting_up_internal attribute_hidden;
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -52,7 +53,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env)
|
|||||||
/* Print a debug message if wanted. */
|
/* Print a debug message if wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling init: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling init: %s\n\n",
|
||||||
l->l_name[0] ? l->l_name : _dl_argv[0]);
|
l->l_name[0] ? l->l_name : rtld_progname);
|
||||||
|
|
||||||
/* Now run the local constructors. There are two forms of them:
|
/* Now run the local constructors. There are two forms of them:
|
||||||
- the one named by DT_INIT
|
- the one named by DT_INIT
|
||||||
@ -108,7 +109,7 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
|
|||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\ncalling preinit: %s\n\n",
|
INTUSE(_dl_debug_printf) ("\ncalling preinit: %s\n\n",
|
||||||
main_map->l_name[0]
|
main_map->l_name[0]
|
||||||
? main_map->l_name : _dl_argv[0]);
|
? main_map->l_name : rtld_progname);
|
||||||
|
|
||||||
addrs = (ElfW(Addr) *) (main_map->l_info[DT_PREINIT_ARRAY]->d_un.d_ptr
|
addrs = (ElfW(Addr) *) (main_map->l_info[DT_PREINIT_ARRAY]->d_un.d_ptr
|
||||||
+ main_map->l_addr);
|
+ main_map->l_addr);
|
||||||
@ -142,6 +143,6 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
|
|||||||
INTUSE(_dl_debug_state) ();
|
INTUSE(_dl_debug_state) ();
|
||||||
|
|
||||||
/* Finished starting up. */
|
/* Finished starting up. */
|
||||||
_dl_starting_up = 0;
|
INTUSE(_dl_starting_up) = 0;
|
||||||
}
|
}
|
||||||
INTDEF (_dl_init)
|
INTDEF (_dl_init)
|
||||||
|
@ -201,7 +201,7 @@ _dl_dst_count (const char *name, int is_path)
|
|||||||
is $ORIGIN alone) and it must always appear first in path. */
|
is $ORIGIN alone) and it must always appear first in path. */
|
||||||
++name;
|
++name;
|
||||||
if ((len = is_dst (start, name, "ORIGIN", is_path,
|
if ((len = is_dst (start, name, "ORIGIN", is_path,
|
||||||
__libc_enable_secure)) != 0
|
INTUSE(__libc_enable_secure))) != 0
|
||||||
|| ((len = is_dst (start, name, "PLATFORM", is_path, 0))
|
|| ((len = is_dst (start, name, "PLATFORM", is_path, 0))
|
||||||
!= 0))
|
!= 0))
|
||||||
++cnt;
|
++cnt;
|
||||||
@ -237,7 +237,7 @@ _dl_dst_substitute (struct link_map *l, const char *name, char *result,
|
|||||||
|
|
||||||
++name;
|
++name;
|
||||||
if ((len = is_dst (start, name, "ORIGIN", is_path,
|
if ((len = is_dst (start, name, "ORIGIN", is_path,
|
||||||
__libc_enable_secure)) != 0)
|
INTUSE(__libc_enable_secure))) != 0)
|
||||||
repl = l->l_origin;
|
repl = l->l_origin;
|
||||||
else if ((len = is_dst (start, name, "PLATFORM", is_path,
|
else if ((len = is_dst (start, name, "PLATFORM", is_path,
|
||||||
0)) != 0)
|
0)) != 0)
|
||||||
@ -494,7 +494,7 @@ decompose_rpath (struct r_search_path_struct *sps,
|
|||||||
/* First see whether we must forget the RUNPATH and RPATH from this
|
/* First see whether we must forget the RUNPATH and RPATH from this
|
||||||
object. */
|
object. */
|
||||||
if (__builtin_expect (GL(dl_inhibit_rpath) != NULL, 0)
|
if (__builtin_expect (GL(dl_inhibit_rpath) != NULL, 0)
|
||||||
&& !__libc_enable_secure)
|
&& !INTUSE(__libc_enable_secure))
|
||||||
{
|
{
|
||||||
const char *inhp = GL(dl_inhibit_rpath);
|
const char *inhp = GL(dl_inhibit_rpath);
|
||||||
|
|
||||||
@ -711,7 +711,8 @@ _dl_init_paths (const char *llp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
(void) fillin_rpath (llp_tmp, env_path_list.dirs, ":;",
|
(void) fillin_rpath (llp_tmp, env_path_list.dirs, ":;",
|
||||||
__libc_enable_secure, "LD_LIBRARY_PATH", NULL);
|
INTUSE(__libc_enable_secure), "LD_LIBRARY_PATH",
|
||||||
|
NULL);
|
||||||
|
|
||||||
if (env_path_list.dirs[0] == NULL)
|
if (env_path_list.dirs[0] == NULL)
|
||||||
{
|
{
|
||||||
@ -1268,7 +1269,7 @@ print_search_path (struct r_search_path_elem **list,
|
|||||||
|
|
||||||
if (name != NULL)
|
if (name != NULL)
|
||||||
_dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
|
_dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
|
||||||
name[0] ? name : _dl_argv[0]);
|
name[0] ? name : rtld_progname);
|
||||||
else
|
else
|
||||||
_dl_debug_printf_c ("\t\t(%s)\n", what);
|
_dl_debug_printf_c ("\t\t(%s)\n", what);
|
||||||
}
|
}
|
||||||
@ -1542,7 +1543,7 @@ open_path (const char *name, size_t namelen, int preloaded,
|
|||||||
here_any |= this_dir->status[cnt] == existing;
|
here_any |= this_dir->status[cnt] == existing;
|
||||||
|
|
||||||
if (fd != -1 && __builtin_expect (preloaded, 0)
|
if (fd != -1 && __builtin_expect (preloaded, 0)
|
||||||
&& __libc_enable_secure)
|
&& INTUSE(__libc_enable_secure))
|
||||||
{
|
{
|
||||||
/* This is an extra security effort to make sure nobody can
|
/* This is an extra security effort to make sure nobody can
|
||||||
preload broken shared objects which are in the trusted
|
preload broken shared objects which are in the trusted
|
||||||
@ -1649,7 +1650,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0)
|
||||||
&& loader != NULL)
|
&& loader != NULL)
|
||||||
INTUSE(_dl_debug_printf) ("\nfile=%s; needed by %s\n", name,
|
INTUSE(_dl_debug_printf) ("\nfile=%s; needed by %s\n", name,
|
||||||
loader->l_name[0] ? loader->l_name : _dl_argv[0]);
|
loader->l_name[0]
|
||||||
|
? loader->l_name : rtld_progname);
|
||||||
|
|
||||||
if (strchr (name, '/') == NULL)
|
if (strchr (name, '/') == NULL)
|
||||||
{
|
{
|
||||||
@ -1740,7 +1742,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fd == -1
|
if (fd == -1
|
||||||
&& (__builtin_expect (! preloaded, 1) || ! __libc_enable_secure))
|
&& (__builtin_expect (! preloaded, 1)
|
||||||
|
|| ! INTUSE(__libc_enable_secure)))
|
||||||
{
|
{
|
||||||
/* Check the list of libraries in the file /etc/ld.so.cache,
|
/* Check the list of libraries in the file /etc/ld.so.cache,
|
||||||
for compatibility with Linux's ldconfig program. */
|
for compatibility with Linux's ldconfig program. */
|
||||||
|
@ -171,9 +171,9 @@ add_dependency (struct link_map *undef_map, struct link_map *map)
|
|||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_FILES, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
\nfile=%s; needed by %s (relocation dependency)\n\n",
|
\nfile=%s; needed by %s (relocation dependency)\n\n",
|
||||||
map->l_name[0] ? map->l_name : _dl_argv[0],
|
map->l_name[0] ? map->l_name : rtld_progname,
|
||||||
undef_map->l_name[0]
|
undef_map->l_name[0]
|
||||||
? undef_map->l_name : _dl_argv[0]);
|
? undef_map->l_name : rtld_progname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* Whoa, that was bad luck. We have to search again. */
|
/* Whoa, that was bad luck. We have to search again. */
|
||||||
@ -256,7 +256,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
|
|||||||
/* XXX We cannot translate the messages. */
|
/* XXX We cannot translate the messages. */
|
||||||
_dl_signal_cerror (0, (reference_name[0]
|
_dl_signal_cerror (0, (reference_name[0]
|
||||||
? reference_name
|
? reference_name
|
||||||
: (_dl_argv[0] ?: "<main program>")),
|
: (rtld_progname ?: "<main program>")),
|
||||||
N_("relocation error"),
|
N_("relocation error"),
|
||||||
make_string (undefined_msg, undef_name));
|
make_string (undefined_msg, undef_name));
|
||||||
*ref = NULL;
|
*ref = NULL;
|
||||||
@ -419,7 +419,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
|
|||||||
/* XXX We cannot translate the message. */
|
/* XXX We cannot translate the message. */
|
||||||
_dl_signal_cerror (0, (reference_name[0]
|
_dl_signal_cerror (0, (reference_name[0]
|
||||||
? reference_name
|
? reference_name
|
||||||
: (_dl_argv[0] ?: "<main program>")),
|
: (rtld_progname ?: "<main program>")),
|
||||||
N_("relocation error"),
|
N_("relocation error"),
|
||||||
make_string ("symbol ", undef_name, ", version ",
|
make_string ("symbol ", undef_name, ", version ",
|
||||||
version->name,
|
version->name,
|
||||||
@ -443,7 +443,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
|
|||||||
/* XXX We cannot translate the message. */
|
/* XXX We cannot translate the message. */
|
||||||
_dl_signal_cerror (0, (reference_name[0]
|
_dl_signal_cerror (0, (reference_name[0]
|
||||||
? reference_name
|
? reference_name
|
||||||
: (_dl_argv[0] ?: "<main program>")), NULL,
|
: (rtld_progname ?: "<main program>")), NULL,
|
||||||
make_string (undefined_msg, undef_name,
|
make_string (undefined_msg, undef_name,
|
||||||
", version ",
|
", version ",
|
||||||
version->name ?: NULL));
|
version->name ?: NULL));
|
||||||
@ -528,7 +528,7 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
|
|||||||
/* XXX We cannot translate the messages. */
|
/* XXX We cannot translate the messages. */
|
||||||
_dl_signal_cerror (0, (reference_name[0]
|
_dl_signal_cerror (0, (reference_name[0]
|
||||||
? reference_name
|
? reference_name
|
||||||
: (_dl_argv[0] ?: "<main program>")),
|
: (rtld_progname ?: "<main program>")),
|
||||||
NULL, buf);
|
NULL, buf);
|
||||||
}
|
}
|
||||||
*ref = NULL;
|
*ref = NULL;
|
||||||
@ -604,9 +604,9 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
|
|||||||
INTUSE(_dl_debug_printf) ("binding file %s to %s: %s symbol `%s'",
|
INTUSE(_dl_debug_printf) ("binding file %s to %s: %s symbol `%s'",
|
||||||
(reference_name[0]
|
(reference_name[0]
|
||||||
? reference_name
|
? reference_name
|
||||||
: (_dl_argv[0] ?: "<main program>")),
|
: (rtld_progname ?: "<main program>")),
|
||||||
value->m->l_name[0]
|
value->m->l_name[0]
|
||||||
? value->m->l_name : _dl_argv[0],
|
? value->m->l_name : rtld_progname,
|
||||||
protected ? "protected" : "normal",
|
protected ? "protected" : "normal",
|
||||||
undef_name);
|
undef_name);
|
||||||
if (version)
|
if (version)
|
||||||
|
@ -558,3 +558,4 @@ _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
|
|||||||
done:
|
done:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
INTDEF(_dl_mcount)
|
||||||
|
@ -60,7 +60,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
|||||||
|
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0))
|
||||||
INTUSE(_dl_debug_printf) ("\nrelocation processing: %s%s\n",
|
INTUSE(_dl_debug_printf) ("\nrelocation processing: %s%s\n",
|
||||||
l->l_name[0] ? l->l_name : _dl_argv[0],
|
l->l_name[0] ? l->l_name : rtld_progname,
|
||||||
lazy ? " (lazy)" : "");
|
lazy ? " (lazy)" : "");
|
||||||
|
|
||||||
/* DT_TEXTREL is now in level 2 and might phase out at some time.
|
/* DT_TEXTREL is now in level 2 and might phase out at some time.
|
||||||
@ -172,7 +172,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
|||||||
errstring = N_("%s: profiler found no PLTREL in object %s\n");
|
errstring = N_("%s: profiler found no PLTREL in object %s\n");
|
||||||
fatal:
|
fatal:
|
||||||
_dl_fatal_printf (errstring,
|
_dl_fatal_printf (errstring,
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
l->l_name);
|
l->l_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ profile_fixup (
|
|||||||
#endif
|
#endif
|
||||||
struct link_map *l, ElfW(Word) reloc_offset, ElfW(Addr) retaddr)
|
struct link_map *l, ElfW(Word) reloc_offset, ElfW(Addr) retaddr)
|
||||||
{
|
{
|
||||||
void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = _dl_mcount;
|
void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = INTUSE(_dl_mcount);
|
||||||
ElfW(Addr) *resultp;
|
ElfW(Addr) *resultp;
|
||||||
lookup_t result;
|
lookup_t result;
|
||||||
ElfW(Addr) value;
|
ElfW(Addr) value;
|
||||||
|
@ -90,7 +90,7 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string,
|
|||||||
INTUSE(_dl_debug_printf) ("\
|
INTUSE(_dl_debug_printf) ("\
|
||||||
checking for version `%s' in file %s required by file %s\n",
|
checking for version `%s' in file %s required by file %s\n",
|
||||||
string, map->l_name[0]
|
string, map->l_name[0]
|
||||||
? map->l_name : _dl_argv[0], name);
|
? map->l_name : rtld_progname, name);
|
||||||
|
|
||||||
if (__builtin_expect (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL, 0))
|
if (__builtin_expect (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL, 0))
|
||||||
{
|
{
|
||||||
@ -166,7 +166,7 @@ no version information available (required by ", name, ")");
|
|||||||
name, ")");
|
name, ")");
|
||||||
result = 1;
|
result = 1;
|
||||||
call_cerror:
|
call_cerror:
|
||||||
_dl_signal_cerror (0, map->l_name[0] ? map->l_name : _dl_argv[0],
|
_dl_signal_cerror (0, map->l_name[0] ? map->l_name : rtld_progname,
|
||||||
NULL, errstring);
|
NULL, errstring);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -215,7 +215,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
|||||||
" of Verneed record\n");
|
" of Verneed record\n");
|
||||||
call_error:
|
call_error:
|
||||||
INTUSE(_dl_signal_error) (errval, (*map->l_name
|
INTUSE(_dl_signal_error) (errval, (*map->l_name
|
||||||
? map->l_name : _dl_argv[0]),
|
? map->l_name : rtld_progname),
|
||||||
NULL, errstring);
|
NULL, errstring);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
|||||||
{
|
{
|
||||||
/* Match the symbol. */
|
/* Match the symbol. */
|
||||||
result |= match_symbol ((*map->l_name
|
result |= match_symbol ((*map->l_name
|
||||||
? map->l_name : _dl_argv[0]),
|
? map->l_name : rtld_progname),
|
||||||
aux->vna_hash,
|
aux->vna_hash,
|
||||||
strtab + aux->vna_name,
|
strtab + aux->vna_name,
|
||||||
needed, verbose,
|
needed, verbose,
|
||||||
|
@ -61,8 +61,9 @@ FCT (const char *undef_name, unsigned long int hash, const ElfW(Sym) *ref,
|
|||||||
|
|
||||||
/* Print some debugging info if wanted. */
|
/* Print some debugging info if wanted. */
|
||||||
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
|
if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_SYMBOLS, 0))
|
||||||
INTUSE(_dl_debug_printf) ("symbol=%s; lookup in file=%s\n", undef_name,
|
INTUSE(_dl_debug_printf) ("symbol=%s; lookup in file=%s\n",
|
||||||
map->l_name[0] ? map->l_name : _dl_argv[0]);
|
undef_name, (map->l_name[0]
|
||||||
|
? map->l_name : rtld_progname));
|
||||||
|
|
||||||
symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
|
symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
|
71
elf/rtld.c
71
elf/rtld.c
@ -59,7 +59,8 @@ enum mode { normal, list, verify, trace };
|
|||||||
static void process_envvars (enum mode *modep);
|
static void process_envvars (enum mode *modep);
|
||||||
|
|
||||||
int _dl_argc;
|
int _dl_argc;
|
||||||
char **_dl_argv;
|
char **_dl_argv = NULL;
|
||||||
|
INTDEF(_dl_argv)
|
||||||
unsigned int _dl_skip_args; /* Nonzero if we were run directly. */
|
unsigned int _dl_skip_args; /* Nonzero if we were run directly. */
|
||||||
|
|
||||||
/* Set nonzero during loading and initialization of executable and
|
/* Set nonzero during loading and initialization of executable and
|
||||||
@ -69,7 +70,8 @@ unsigned int _dl_skip_args; /* Nonzero if we were run directly. */
|
|||||||
definition seen by libc.so's initializer; that value must be zero,
|
definition seen by libc.so's initializer; that value must be zero,
|
||||||
and will be since that dynamic linker's _dl_start and dl_main will
|
and will be since that dynamic linker's _dl_start and dl_main will
|
||||||
never be called. */
|
never be called. */
|
||||||
int _dl_starting_up;
|
int _dl_starting_up = 0;
|
||||||
|
INTVARDEF(_dl_starting_up)
|
||||||
|
|
||||||
/* This is the structure which defines all variables global to ld.so
|
/* This is the structure which defines all variables global to ld.so
|
||||||
(except those which cannot be added for some reason). */
|
(except those which cannot be added for some reason). */
|
||||||
@ -489,7 +491,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
process_envvars (&mode);
|
process_envvars (&mode);
|
||||||
|
|
||||||
/* Set up a flag which tells we are just starting. */
|
/* Set up a flag which tells we are just starting. */
|
||||||
_dl_starting_up = 1;
|
INTUSE(_dl_starting_up) = 1;
|
||||||
|
|
||||||
if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
|
if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
|
||||||
{
|
{
|
||||||
@ -511,41 +513,43 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
rtld_is_main = true;
|
rtld_is_main = true;
|
||||||
|
|
||||||
/* Note the place where the dynamic linker actually came from. */
|
/* Note the place where the dynamic linker actually came from. */
|
||||||
GL(dl_rtld_map).l_name = _dl_argv[0];
|
GL(dl_rtld_map).l_name = rtld_progname;
|
||||||
|
|
||||||
while (_dl_argc > 1)
|
while (_dl_argc > 1)
|
||||||
if (! strcmp (_dl_argv[1], "--list"))
|
if (! strcmp (INTUSE(_dl_argv)[1], "--list"))
|
||||||
{
|
{
|
||||||
mode = list;
|
mode = list;
|
||||||
GL(dl_lazy) = -1; /* This means do no dependency analysis. */
|
GL(dl_lazy) = -1; /* This means do no dependency analysis. */
|
||||||
|
|
||||||
++_dl_skip_args;
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
++_dl_argv;
|
++INTUSE(_dl_argv);
|
||||||
}
|
}
|
||||||
else if (! strcmp (_dl_argv[1], "--verify"))
|
else if (! strcmp (INTUSE(_dl_argv)[1], "--verify"))
|
||||||
{
|
{
|
||||||
mode = verify;
|
mode = verify;
|
||||||
|
|
||||||
++_dl_skip_args;
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
++_dl_argv;
|
++INTUSE(_dl_argv);
|
||||||
}
|
}
|
||||||
else if (! strcmp (_dl_argv[1], "--library-path") && _dl_argc > 2)
|
else if (! strcmp (INTUSE(_dl_argv)[1], "--library-path")
|
||||||
|
&& _dl_argc > 2)
|
||||||
{
|
{
|
||||||
library_path = _dl_argv[2];
|
library_path = INTUSE(_dl_argv)[2];
|
||||||
|
|
||||||
_dl_skip_args += 2;
|
_dl_skip_args += 2;
|
||||||
_dl_argc -= 2;
|
_dl_argc -= 2;
|
||||||
_dl_argv += 2;
|
INTUSE(_dl_argv) += 2;
|
||||||
}
|
}
|
||||||
else if (! strcmp (_dl_argv[1], "--inhibit-rpath") && _dl_argc > 2)
|
else if (! strcmp (INTUSE(_dl_argv)[1], "--inhibit-rpath")
|
||||||
|
&& _dl_argc > 2)
|
||||||
{
|
{
|
||||||
GL(dl_inhibit_rpath) = _dl_argv[2];
|
GL(dl_inhibit_rpath) = INTUSE(_dl_argv)[2];
|
||||||
|
|
||||||
_dl_skip_args += 2;
|
_dl_skip_args += 2;
|
||||||
_dl_argc -= 2;
|
_dl_argc -= 2;
|
||||||
_dl_argv += 2;
|
INTUSE(_dl_argv) += 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
@ -577,7 +581,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
|
|
||||||
++_dl_skip_args;
|
++_dl_skip_args;
|
||||||
--_dl_argc;
|
--_dl_argc;
|
||||||
++_dl_argv;
|
++INTUSE(_dl_argv);
|
||||||
|
|
||||||
/* Initialize the data structures for the search paths for shared
|
/* Initialize the data structures for the search paths for shared
|
||||||
objects. */
|
objects. */
|
||||||
@ -589,19 +593,17 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
const char *err_str = NULL;
|
const char *err_str = NULL;
|
||||||
struct map_args args;
|
struct map_args args;
|
||||||
|
|
||||||
args.str = _dl_argv[0];
|
args.str = rtld_progname;
|
||||||
(void) INTUSE(_dl_catch_error) (&objname, &err_str, map_doit, &args);
|
(void) INTUSE(_dl_catch_error) (&objname, &err_str, map_doit, &args);
|
||||||
if (__builtin_expect (err_str != NULL, 0))
|
if (__builtin_expect (err_str != NULL, 0))
|
||||||
{
|
/* We don't free the returned string, the programs stops
|
||||||
if (err_str != _dl_out_of_memory)
|
anyway. */
|
||||||
free ((char *) err_str);
|
|
||||||
_exit (EXIT_FAILURE);
|
_exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HP_TIMING_NOW (start);
|
HP_TIMING_NOW (start);
|
||||||
INTUSE(_dl_map_object) (NULL, _dl_argv[0], 0, lt_library, 0, 0);
|
INTUSE(_dl_map_object) (NULL, rtld_progname, 0, lt_library, 0, 0);
|
||||||
HP_TIMING_NOW (stop);
|
HP_TIMING_NOW (stop);
|
||||||
|
|
||||||
HP_TIMING_DIFF (load_time, start, stop);
|
HP_TIMING_DIFF (load_time, start, stop);
|
||||||
@ -814,7 +816,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
/* Prevent optimizing strsep. Speed is not important here. */
|
/* Prevent optimizing strsep. Speed is not important here. */
|
||||||
while ((p = (strsep) (&list, " :")) != NULL)
|
while ((p = (strsep) (&list, " :")) != NULL)
|
||||||
if (p[0] != '\0'
|
if (p[0] != '\0'
|
||||||
&& (__builtin_expect (! __libc_enable_secure, 1)
|
&& (__builtin_expect (! INTUSE(__libc_enable_secure), 1)
|
||||||
|| strchr (p, '/') == NULL))
|
|| strchr (p, '/') == NULL))
|
||||||
{
|
{
|
||||||
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded),
|
struct link_map *new_map = INTUSE(_dl_map_object) (GL(dl_loaded),
|
||||||
@ -1029,9 +1031,9 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
GL(dl_trace_prelink_map) = l;
|
GL(dl_trace_prelink_map) = l;
|
||||||
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)\n",
|
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)\n",
|
||||||
l->l_libname->name[0] ? l->l_libname->name
|
l->l_libname->name[0] ? l->l_libname->name
|
||||||
: _dl_argv[0] ?: "<main program>",
|
: rtld_progname ?: "<main program>",
|
||||||
l->l_name[0] ? l->l_name
|
l->l_name[0] ? l->l_name
|
||||||
: _dl_argv[0] ?: "<main program>",
|
: rtld_progname ?: "<main program>",
|
||||||
(int) sizeof l->l_map_start * 2,
|
(int) sizeof l->l_map_start * 2,
|
||||||
l->l_map_start,
|
l->l_map_start,
|
||||||
(int) sizeof l->l_addr * 2,
|
(int) sizeof l->l_addr * 2,
|
||||||
@ -1058,14 +1060,15 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
ElfW(Addr) loadbase;
|
ElfW(Addr) loadbase;
|
||||||
lookup_t result;
|
lookup_t result;
|
||||||
|
|
||||||
result = INTUSE(_dl_lookup_symbol) (_dl_argv[i], GL(dl_loaded),
|
result = INTUSE(_dl_lookup_symbol) (INTUSE(_dl_argv)[i],
|
||||||
|
GL(dl_loaded),
|
||||||
&ref, GL(dl_loaded)->l_scope,
|
&ref, GL(dl_loaded)->l_scope,
|
||||||
ELF_RTYPE_CLASS_PLT, 1);
|
ELF_RTYPE_CLASS_PLT, 1);
|
||||||
|
|
||||||
loadbase = LOOKUP_VALUE_ADDRESS (result);
|
loadbase = LOOKUP_VALUE_ADDRESS (result);
|
||||||
|
|
||||||
_dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n",
|
_dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n",
|
||||||
_dl_argv[i],
|
INTUSE(_dl_argv)[i],
|
||||||
(int) sizeof ref->st_value * 2, ref->st_value,
|
(int) sizeof ref->st_value * 2, ref->st_value,
|
||||||
(int) sizeof loadbase * 2, loadbase);
|
(int) sizeof loadbase * 2, loadbase);
|
||||||
}
|
}
|
||||||
@ -1127,7 +1130,7 @@ of this helper program; chances are you did not intend to run this program.\n\
|
|||||||
}
|
}
|
||||||
|
|
||||||
_dl_printf ("\t%s:\n",
|
_dl_printf ("\t%s:\n",
|
||||||
map->l_name[0] ? map->l_name : _dl_argv[0]);
|
map->l_name[0] ? map->l_name : rtld_progname);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@ -1459,7 +1462,7 @@ print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
|
|||||||
const char *errstring)
|
const char *errstring)
|
||||||
{
|
{
|
||||||
if (objname[0] == '\0')
|
if (objname[0] == '\0')
|
||||||
objname = _dl_argv[0] ?: "<main program>";
|
objname = rtld_progname ?: "<main program>";
|
||||||
_dl_error_printf ("%s (%s)\n", errstring, objname);
|
_dl_error_printf ("%s (%s)\n", errstring, objname);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1469,7 +1472,7 @@ static void
|
|||||||
print_missing_version (int errcode __attribute__ ((unused)),
|
print_missing_version (int errcode __attribute__ ((unused)),
|
||||||
const char *objname, const char *errstring)
|
const char *objname, const char *errstring)
|
||||||
{
|
{
|
||||||
_dl_error_printf ("%s: %s: %s\n", _dl_argv[0] ?: "<program name unknown>",
|
_dl_error_printf ("%s: %s: %s\n", rtld_progname ?: "<program name unknown>",
|
||||||
objname, errstring);
|
objname, errstring);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1585,8 +1588,8 @@ process_envvars (enum mode *modep)
|
|||||||
char *debug_output = NULL;
|
char *debug_output = NULL;
|
||||||
|
|
||||||
/* This is the default place for profiling data file. */
|
/* This is the default place for profiling data file. */
|
||||||
GL(dl_profile_output) = &"/var/tmp\0/var/profile"[__libc_enable_secure
|
GL(dl_profile_output)
|
||||||
? 9 : 0];
|
= &"/var/tmp\0/var/profile"[INTUSE(__libc_enable_secure) ? 9 : 0];
|
||||||
|
|
||||||
while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
|
while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
|
||||||
{
|
{
|
||||||
@ -1661,7 +1664,7 @@ process_envvars (enum mode *modep)
|
|||||||
|
|
||||||
case 11:
|
case 11:
|
||||||
/* Path where the binary is found. */
|
/* Path where the binary is found. */
|
||||||
if (!__libc_enable_secure
|
if (!INTUSE(__libc_enable_secure)
|
||||||
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
&& memcmp (envline, "ORIGIN_PATH", 11) == 0)
|
||||||
GL(dl_origin_path) = &envline[12];
|
GL(dl_origin_path) = &envline[12];
|
||||||
break;
|
break;
|
||||||
@ -1687,7 +1690,7 @@ process_envvars (enum mode *modep)
|
|||||||
|
|
||||||
case 14:
|
case 14:
|
||||||
/* Where to place the profiling data file. */
|
/* Where to place the profiling data file. */
|
||||||
if (!__libc_enable_secure
|
if (!INTUSE(__libc_enable_secure)
|
||||||
&& memcmp (envline, "PROFILE_OUTPUT", 14) == 0
|
&& memcmp (envline, "PROFILE_OUTPUT", 14) == 0
|
||||||
&& envline[15] != '\0')
|
&& envline[15] != '\0')
|
||||||
GL(dl_profile_output) = &envline[15];
|
GL(dl_profile_output) = &envline[15];
|
||||||
@ -1725,7 +1728,7 @@ process_envvars (enum mode *modep)
|
|||||||
|
|
||||||
/* Extra security for SUID binaries. Remove all dangerous environment
|
/* Extra security for SUID binaries. Remove all dangerous environment
|
||||||
variables. */
|
variables. */
|
||||||
if (__builtin_expect (__libc_enable_secure, 0))
|
if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
|
||||||
{
|
{
|
||||||
static const char unsecure_envvars[] =
|
static const char unsecure_envvars[] =
|
||||||
#ifdef EXTRA_UNSECURE_ENVVARS
|
#ifdef EXTRA_UNSECURE_ENVVARS
|
||||||
|
@ -349,15 +349,27 @@
|
|||||||
strong_alias(real, name)
|
strong_alias(real, name)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_VISIBILITY_ATTRIBUTE && defined SHARED
|
||||||
|
# define attribute_hidden __attribute__ ((visibility ("hidden")))
|
||||||
|
#else
|
||||||
|
# define attribute_hidden
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Handling on non-exported internal names. We have to do this only
|
/* Handling on non-exported internal names. We have to do this only
|
||||||
for shared code. */
|
for shared code. */
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
# define INTUSE(name) name##_internal
|
# define INTUSE(name) name##_internal
|
||||||
# define INTDEF(name) strong_alias (name, name##_internal);
|
# define INTDEF(name) strong_alias (name, name##_internal)
|
||||||
# define INTDEF2(name, newname) strong_alias (name, newname##_internal);
|
# define INTVARDEF(name) \
|
||||||
|
_INTVARDEF(name, name##_internal)
|
||||||
|
# define _INTVARDEF(name, aliasname) \
|
||||||
|
extern __typeof (name) aliasname __attribute__ ((visibility ("hidden"))); \
|
||||||
|
strong_alias (name, name##_internal)
|
||||||
|
# define INTDEF2(name, newname) strong_alias (name, newname##_internal)
|
||||||
#else
|
#else
|
||||||
# define INTUSE(name) name
|
# define INTUSE(name) name
|
||||||
# define INTDEF(name)
|
# define INTDEF(name)
|
||||||
|
# define INTVARDEF(name)
|
||||||
# define INTDEF2(name, newname)
|
# define INTDEF2(name, newname)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -98,6 +98,10 @@ extern void *__sbrk (intptr_t __delta);
|
|||||||
and some functions contained in the C library ignore various
|
and some functions contained in the C library ignore various
|
||||||
environment variables that normally affect them. */
|
environment variables that normally affect them. */
|
||||||
extern int __libc_enable_secure;
|
extern int __libc_enable_secure;
|
||||||
|
#ifdef _RTLD_LOCAL
|
||||||
|
/* XXX The #ifdef should go. */
|
||||||
|
extern int __libc_enable_secure_internal attribute_hidden;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Various internal function. */
|
/* Various internal function. */
|
||||||
|
@ -377,11 +377,9 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
|
|
||||||
/* ARM never uses Elf32_Rela relocations for the dynamic linker.
|
/* ARM never uses Elf32_Rela relocations for the dynamic linker.
|
||||||
Prelinked libraries may use Elf32_Rela though. */
|
Prelinked libraries may use Elf32_Rela though. */
|
||||||
#ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
#define ELF_MACHINE_NO_RELA 1
|
# define ELF_MACHINE_NO_RELA 1
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
extern char **_dl_argv;
|
|
||||||
|
|
||||||
/* Deal with an out-of-range PC24 reloc. */
|
/* Deal with an out-of-range PC24 reloc. */
|
||||||
static Elf32_Addr
|
static Elf32_Addr
|
||||||
@ -426,15 +424,15 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
|
|
||||||
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
||||||
{
|
{
|
||||||
#ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
if (map != &_dl_rtld_map) /* Already done in rtld itself. */
|
if (map != &_dl_rtld_map) /* Already done in rtld itself. */
|
||||||
#endif
|
# endif
|
||||||
*reloc_addr += map->l_addr;
|
*reloc_addr += map->l_addr;
|
||||||
}
|
}
|
||||||
#ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
||||||
return;
|
return;
|
||||||
#endif
|
# endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const Elf32_Sym *const refsym = sym;
|
const Elf32_Sym *const refsym = sym;
|
||||||
@ -457,7 +455,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
@ -465,17 +463,17 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
break;
|
break;
|
||||||
case R_ARM_GLOB_DAT:
|
case R_ARM_GLOB_DAT:
|
||||||
case R_ARM_JUMP_SLOT:
|
case R_ARM_JUMP_SLOT:
|
||||||
#ifdef RTLD_BOOTSTRAP
|
# ifdef RTLD_BOOTSTRAP
|
||||||
/* Fix weak undefined references. */
|
/* Fix weak undefined references. */
|
||||||
if (sym != NULL && sym->st_value == 0)
|
if (sym != NULL && sym->st_value == 0)
|
||||||
*reloc_addr = 0;
|
*reloc_addr = 0;
|
||||||
else
|
else
|
||||||
#endif
|
# endif
|
||||||
*reloc_addr = value;
|
*reloc_addr = value;
|
||||||
break;
|
break;
|
||||||
case R_ARM_ABS32:
|
case R_ARM_ABS32:
|
||||||
{
|
{
|
||||||
#ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
/* This is defined in rtld.c, but nowhere in the static
|
/* This is defined in rtld.c, but nowhere in the static
|
||||||
libc.a; make the reference weak so static programs can
|
libc.a; make the reference weak so static programs can
|
||||||
still link. This declaration cannot be done when
|
still link. This declaration cannot be done when
|
||||||
@ -492,7 +490,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
rather than the dynamic linker's built-in definitions
|
rather than the dynamic linker's built-in definitions
|
||||||
used while loading those libraries. */
|
used while loading those libraries. */
|
||||||
value -= map->l_addr + refsym->st_value;
|
value -= map->l_addr + refsym->st_value;
|
||||||
#endif
|
# endif
|
||||||
*reloc_addr += value;
|
*reloc_addr += value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -529,7 +527,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
static inline void
|
static inline void
|
||||||
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||||
const Elf32_Sym *sym, const struct r_found_version *version,
|
const Elf32_Sym *sym, const struct r_found_version *version,
|
||||||
@ -539,10 +537,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
|
|
||||||
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
if (__builtin_expect (r_type == R_ARM_RELATIVE, 0))
|
||||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
*reloc_addr = map->l_addr + reloc->r_addend;
|
||||||
#ifndef RTLD_BOOTSTRAP
|
|
||||||
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
else if (__builtin_expect (r_type == R_ARM_NONE, 0))
|
||||||
return;
|
return;
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const Elf32_Sym *const refsym = sym;
|
const Elf32_Sym *const refsym = sym;
|
||||||
@ -585,7 +581,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
||||||
@ -594,14 +590,14 @@ elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
|||||||
*reloc_addr += l_addr;
|
*reloc_addr += l_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef RTLD_BOOTSTRAP
|
# ifndef RTLD_BOOTSTRAP
|
||||||
static inline void
|
static inline void
|
||||||
elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
|
elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
|
||||||
Elf32_Addr *const reloc_addr)
|
Elf32_Addr *const reloc_addr)
|
||||||
{
|
{
|
||||||
*reloc_addr = l_addr + reloc->r_addend;
|
*reloc_addr = l_addr + reloc->r_addend;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
elf_machine_lazy_rel (struct link_map *map,
|
elf_machine_lazy_rel (struct link_map *map,
|
||||||
|
@ -314,13 +314,12 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
extern char **_dl_argv;
|
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <dl-dst.h>
|
#include <dl-dst.h>
|
||||||
|
|
||||||
|
|
||||||
|
#undef _dl_get_origin
|
||||||
const char *
|
const char *
|
||||||
_dl_get_origin (void)
|
_dl_get_origin (void)
|
||||||
{
|
{
|
||||||
@ -49,3 +50,4 @@ _dl_get_origin (void)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
INTDEF(_dl_get_origin)
|
||||||
|
@ -47,7 +47,8 @@ extern void __libc_check_standard_fds (void);
|
|||||||
#ifdef NEED_DL_BASE_ADDR
|
#ifdef NEED_DL_BASE_ADDR
|
||||||
ElfW(Addr) _dl_base_addr;
|
ElfW(Addr) _dl_base_addr;
|
||||||
#endif
|
#endif
|
||||||
int __libc_enable_secure;
|
int __libc_enable_secure = 0;
|
||||||
|
INTVARDEF(__libc_enable_secure)
|
||||||
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
|
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
|
||||||
of init-first. */
|
of init-first. */
|
||||||
/* This variable contains the lowest stack address ever used. */
|
/* This variable contains the lowest stack address ever used. */
|
||||||
@ -89,7 +90,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
# define set_seen(tag) seen |= M ((tag)->a_type)
|
# define set_seen(tag) seen |= M ((tag)->a_type)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, _dl_argv, _environ,
|
DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
|
||||||
_dl_auxv);
|
_dl_auxv);
|
||||||
|
|
||||||
user_entry = (ElfW(Addr)) ENTRY_POINT;
|
user_entry = (ElfW(Addr)) ENTRY_POINT;
|
||||||
@ -156,7 +157,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
SEE (EGID, egid);
|
SEE (EGID, egid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__libc_enable_secure = uid != euid || gid != egid;
|
INTUSE(__libc_enable_secure) = uid != euid || gid != egid;
|
||||||
|
|
||||||
#ifndef HAVE_AUX_PAGESIZE
|
#ifndef HAVE_AUX_PAGESIZE
|
||||||
if (GL(dl_pagesize) == 0)
|
if (GL(dl_pagesize) == 0)
|
||||||
@ -186,7 +187,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
|
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
|
||||||
allocated. If necessary we are doing it ourself. If it is not
|
allocated. If necessary we are doing it ourself. If it is not
|
||||||
possible we stop the program. */
|
possible we stop the program. */
|
||||||
if (__builtin_expect (__libc_enable_secure, 0))
|
if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
|
||||||
__libc_check_standard_fds ();
|
__libc_check_standard_fds ();
|
||||||
|
|
||||||
(*dl_main) (phdr, phnum, &user_entry);
|
(*dl_main) (phdr, phnum, &user_entry);
|
||||||
|
@ -394,9 +394,19 @@ extern struct rtld_global _rtld_local __rtld_local_attribute__;
|
|||||||
/* Parameters passed to the dynamic linker. */
|
/* Parameters passed to the dynamic linker. */
|
||||||
extern int _dl_argc;
|
extern int _dl_argc;
|
||||||
extern char **_dl_argv;
|
extern char **_dl_argv;
|
||||||
|
#ifdef _RTLD_LOCAL
|
||||||
|
extern char **_dl_argv_internal attribute_hidden;
|
||||||
|
# define rtld_progname (INTUSE(_dl_argv)[0])
|
||||||
|
#else
|
||||||
|
# define rtld_progname _dl_argv[0]
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The array with message we print as a last resort. */
|
/* The array with message we print as a last resort. */
|
||||||
extern const char _dl_out_of_memory[];
|
extern const char _dl_out_of_memory[];
|
||||||
|
#ifdef _RTLD_LOCAL
|
||||||
|
/* XXX #ifdef should go away. */
|
||||||
|
extern const char _dl_out_of_memory_internal[] attribute_hidden;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* OS-dependent function to open the zero-fill device. */
|
/* OS-dependent function to open the zero-fill device. */
|
||||||
@ -645,6 +655,7 @@ extern void _dl_start_profile_internal (struct link_map *map,
|
|||||||
|
|
||||||
/* The actual functions used to keep book on the calls. */
|
/* The actual functions used to keep book on the calls. */
|
||||||
extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
|
extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc);
|
||||||
|
extern void _dl_mcount_internal (ElfW(Addr) frompc, ElfW(Addr) selfpc);
|
||||||
|
|
||||||
/* This function is simply a wrapper around the _dl_mcount function
|
/* This function is simply a wrapper around the _dl_mcount function
|
||||||
which does not require a FROMPC parameter since this is the
|
which does not require a FROMPC parameter since this is the
|
||||||
|
@ -611,7 +611,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value,
|
memcpy (reloc_addr, (void *) value,
|
||||||
|
@ -433,7 +433,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -253,13 +253,12 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (sym->st_size < refsym->st_size && GL(dl_verbose)))
|
|| (sym->st_size < refsym->st_size && GL(dl_verbose)))
|
||||||
{
|
{
|
||||||
extern char **_dl_argv;
|
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -47,7 +47,8 @@ extern int _dl_argc;
|
|||||||
extern char **_dl_argv;
|
extern char **_dl_argv;
|
||||||
extern char **_environ;
|
extern char **_environ;
|
||||||
|
|
||||||
int __libc_enable_secure;
|
int __libc_enable_secure = 0;
|
||||||
|
INTVARDEF(__libc_enable_secure)
|
||||||
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
|
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
|
||||||
of init-first. */
|
of init-first. */
|
||||||
/* This variable containts the lowest stack address ever used. */
|
/* This variable containts the lowest stack address ever used. */
|
||||||
@ -128,7 +129,7 @@ _dl_sysdep_start (void **start_argptr,
|
|||||||
else
|
else
|
||||||
_dl_hurd_data = (void *) p;
|
_dl_hurd_data = (void *) p;
|
||||||
|
|
||||||
__libc_enable_secure = _dl_hurd_data->flags & EXEC_SECURE;
|
INTUSE(__libc_enable_secure) = _dl_hurd_data->flags & EXEC_SECURE;
|
||||||
|
|
||||||
if (_dl_hurd_data->flags & EXEC_STACK_ARGS &&
|
if (_dl_hurd_data->flags & EXEC_STACK_ARGS &&
|
||||||
_dl_hurd_data->user_entry == 0)
|
_dl_hurd_data->user_entry == 0)
|
||||||
@ -208,7 +209,7 @@ unfmh(); /* XXX */
|
|||||||
environment list.
|
environment list.
|
||||||
|
|
||||||
We use memmove, since the locations might overlap. */
|
We use memmove, since the locations might overlap. */
|
||||||
if (__libc_enable_secure || _dl_skip_args)
|
if (INTUSE(__libc_enable_secure) || _dl_skip_args)
|
||||||
{
|
{
|
||||||
char **newp;
|
char **newp;
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ __process_machine_rela (struct link_map *map,
|
|||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, onsider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, onsider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
|
memcpy (reloc_addr, (char *) finaladdr, MIN (sym->st_size,
|
||||||
|
@ -406,7 +406,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
strtab = (const char *) D_PTR(map,l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR(map,l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -374,7 +374,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR (map,l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -442,8 +442,6 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
/* SH never uses Elf32_Rel relocations. */
|
/* SH never uses Elf32_Rel relocations. */
|
||||||
#define ELF_MACHINE_NO_REL 1
|
#define ELF_MACHINE_NO_REL 1
|
||||||
|
|
||||||
extern char **_dl_argv;
|
|
||||||
|
|
||||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||||
MAP is the object containing the reloc. */
|
MAP is the object containing the reloc. */
|
||||||
|
|
||||||
@ -520,7 +518,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -460,13 +460,12 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
|||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
extern char **_dl_argv;
|
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -286,13 +286,12 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
if (sym->st_size > refsym->st_size
|
if (sym->st_size > refsym->st_size
|
||||||
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
|| (GL(dl_verbose) && sym->st_size < refsym->st_size))
|
||||||
{
|
{
|
||||||
extern char **_dl_argv;
|
|
||||||
const char *strtab;
|
const char *strtab;
|
||||||
|
|
||||||
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
the path of the application from the /proc/self/exe symlink. Try this
|
the path of the application from the /proc/self/exe symlink. Try this
|
||||||
first and fall back on the generic method if necessary. */
|
first and fall back on the generic method if necessary. */
|
||||||
|
|
||||||
|
#undef _dl_get_origin
|
||||||
const char *
|
const char *
|
||||||
_dl_get_origin (void)
|
_dl_get_origin (void)
|
||||||
{
|
{
|
||||||
@ -38,7 +39,7 @@ _dl_get_origin (void)
|
|||||||
char *result;
|
char *result;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if ((len = __readlink ("/proc/self/exe", linkval, PATH_MAX)) > 0
|
if ((len = __readlink ("/proc/self/exe", linkval, sizeof (linkval))) > 0
|
||||||
&& linkval[0] != '[')
|
&& linkval[0] != '[')
|
||||||
{
|
{
|
||||||
/* We can use this value. */
|
/* We can use this value. */
|
||||||
@ -76,3 +77,4 @@ _dl_get_origin (void)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
INTDEF(_dl_get_origin)
|
||||||
|
@ -386,7 +386,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
|||||||
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||||
_dl_error_printf ("\
|
_dl_error_printf ("\
|
||||||
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
%s: Symbol `%s' has different size in shared object, consider re-linking\n",
|
||||||
_dl_argv[0] ?: "<program name unknown>",
|
rtld_progname ?: "<program name unknown>",
|
||||||
strtab + refsym->st_name);
|
strtab + refsym->st_name);
|
||||||
}
|
}
|
||||||
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
|
||||||
|
Reference in New Issue
Block a user