mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 03:33:33 +08:00
Update.
2000-06-09 Ulrich Drepper <drepper@redhat.com> Rewrite error message handling. * elf/dl-deps.c (_dl_map_object_deps): Pass new parameter to _dl_catch_error. * elf/dl-error (struct catch): Add objname member. (_dl_signal_error): Take new parameter with object name. When passing message on simply store object name and duplicate error message. (_dl_catch_error): Take new parameter. Store object name in the place pointed to. * include/dlfcn.h: Adjust _dl_catch_error prototype. * sysdeps/generic/ldsodefs.h: Adjust _dl_signal_error prototype. * elf/dl-libc.c (dlerror_run): Pass new parameter to _dl_catch_error. * elf/dl-open.c (_dl_open): Likewise. * elf/rtld.c (dl_main): Likewise. * elf/dl-close.c: Mark error messages with N_(). * elf/dl-deps.c: Likewise. * elf/dl-error.c: Likewise. * elf/dl-load.c: Likewise. * elf/dl-open.c: Likewise. * elf/dl-reloc.c: Likewise. * elf/dl-support.c: Likewise. * elf/dl-sym.c: Likewise. * elf/dl-version.c: Likewise. * elf/dl-lookup.c: Add comments about problems with error message translations. * elf/dl-reloc.c: Likewise. * elf/dl-version.c: Likewise.
This commit is contained in:
parent
f3863621f6
commit
8e17ea5817
30
ChangeLog
30
ChangeLog
@ -1,3 +1,33 @@
|
||||
2000-06-09 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
Rewrite error message handling.
|
||||
* elf/dl-deps.c (_dl_map_object_deps): Pass new parameter to
|
||||
_dl_catch_error.
|
||||
* elf/dl-error (struct catch): Add objname member.
|
||||
(_dl_signal_error): Take new parameter with object name. When
|
||||
passing message on simply store object name and duplicate error
|
||||
message.
|
||||
(_dl_catch_error): Take new parameter. Store object name in the
|
||||
place pointed to.
|
||||
* include/dlfcn.h: Adjust _dl_catch_error prototype.
|
||||
* sysdeps/generic/ldsodefs.h: Adjust _dl_signal_error prototype.
|
||||
* elf/dl-libc.c (dlerror_run): Pass new parameter to _dl_catch_error.
|
||||
* elf/dl-open.c (_dl_open): Likewise.
|
||||
* elf/rtld.c (dl_main): Likewise.
|
||||
* elf/dl-close.c: Mark error messages with N_().
|
||||
* elf/dl-deps.c: Likewise.
|
||||
* elf/dl-error.c: Likewise.
|
||||
* elf/dl-load.c: Likewise.
|
||||
* elf/dl-open.c: Likewise.
|
||||
* elf/dl-reloc.c: Likewise.
|
||||
* elf/dl-support.c: Likewise.
|
||||
* elf/dl-sym.c: Likewise.
|
||||
* elf/dl-version.c: Likewise.
|
||||
* elf/dl-lookup.c: Add comments about problems with error message
|
||||
translations.
|
||||
* elf/dl-reloc.c: Likewise.
|
||||
* elf/dl-version.c: Likewise.
|
||||
|
||||
2000-06-09 David Mosberger-Tang <davidm@hpl.hp.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/ia64/__longjmp.S: new file
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <dlfcn.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <bits/libc-lock.h>
|
||||
@ -36,8 +37,6 @@ typedef void (*fini_t) (void);
|
||||
protect `dlopen' and `dlclose' in dlclose.c. */
|
||||
__libc_lock_define (extern, _dl_load_lock)
|
||||
|
||||
#define LOSE(s) _dl_signal_error (0, map->l_name, s)
|
||||
|
||||
void
|
||||
internal_function
|
||||
_dl_close (void *_map)
|
||||
@ -50,7 +49,7 @@ _dl_close (void *_map)
|
||||
unsigned int i;
|
||||
|
||||
if (map->l_opencount == 0)
|
||||
LOSE ("shared object not open");
|
||||
_dl_signal_error (0, map->l_name, N_("shared object not open"));
|
||||
|
||||
/* Acquire the lock. */
|
||||
__libc_lock_lock (_dl_load_lock);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <assert.h>
|
||||
#include <dlfcn.h>
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
@ -102,7 +103,7 @@ struct list
|
||||
/* DST must not appear in SUID/SGID programs. */ \
|
||||
if (__libc_enable_secure) \
|
||||
_dl_signal_error (0, __str, \
|
||||
"DST not allowed in SUID/SGID programs"); \
|
||||
N_("DST not allowed in SUID/SGID programs")); \
|
||||
\
|
||||
__newp = (char *) alloca (DL_DST_REQUIRED (l, __str, strlen (__str), \
|
||||
__cnt)); \
|
||||
@ -114,8 +115,8 @@ struct list
|
||||
/* The replacement for the DST is not known. We can't \
|
||||
processed. */ \
|
||||
if (fatal) \
|
||||
_dl_signal_error (0, __str, \
|
||||
"empty dynamics string token substitution"); \
|
||||
_dl_signal_error (0, __str, N_("\
|
||||
empty dynamics string token substitution")); \
|
||||
else \
|
||||
{ \
|
||||
/* This is for DT_AUXILIARY. */ \
|
||||
@ -265,7 +266,8 @@ _dl_map_object_deps (struct link_map *map,
|
||||
}
|
||||
else if (d->d_tag == DT_AUXILIARY || d->d_tag == DT_FILTER)
|
||||
{
|
||||
char *errstring;
|
||||
const char *objname;
|
||||
const char *errstring;
|
||||
struct list *newp;
|
||||
/* Object name. */
|
||||
const char *name;
|
||||
@ -289,11 +291,11 @@ _dl_map_object_deps (struct link_map *map,
|
||||
|
||||
/* We must be prepared that the addressed shared
|
||||
object is not available. */
|
||||
if (_dl_catch_error (&errstring, openaux, &args))
|
||||
if (_dl_catch_error (&objname, &errstring, openaux, &args))
|
||||
{
|
||||
/* We are not interested in the error message. */
|
||||
assert (errstring != NULL);
|
||||
free (errstring);
|
||||
free ((char *) errstring);
|
||||
|
||||
/* Simply ignore this error and continue the work. */
|
||||
continue;
|
||||
@ -452,7 +454,7 @@ _dl_map_object_deps (struct link_map *map,
|
||||
l->l_initfini = malloc (nneeded * sizeof needed[0]);
|
||||
if (l->l_initfini == NULL)
|
||||
_dl_signal_error (ENOMEM, map->l_name,
|
||||
"cannot allocate dependency list");
|
||||
N_("cannot allocate dependency list"));
|
||||
memcpy (l->l_initfini, needed, nneeded * sizeof needed[0]);
|
||||
}
|
||||
|
||||
@ -470,7 +472,7 @@ _dl_map_object_deps (struct link_map *map,
|
||||
* sizeof (struct link_map *));
|
||||
if (map->l_searchlist.r_list == NULL)
|
||||
_dl_signal_error (ENOMEM, map->l_name,
|
||||
"cannot allocate symbol search list");
|
||||
N_("cannot allocate symbol search list"));
|
||||
map->l_searchlist.r_nlist = nlist;
|
||||
|
||||
for (nlist = 0, runp = known; runp; runp = runp->unique)
|
||||
|
@ -17,6 +17,7 @@
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <libintl.h>
|
||||
#include <setjmp.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -28,7 +29,8 @@
|
||||
_dl_signal_error. */
|
||||
struct catch
|
||||
{
|
||||
char *errstring; /* Error detail filled in here. */
|
||||
const char *objname; /* Object/File name. */
|
||||
const char *errstring; /* Error detail filled in here. */
|
||||
jmp_buf env; /* longjmp here on error. */
|
||||
};
|
||||
|
||||
@ -55,34 +57,21 @@ static receiver_fct receiver;
|
||||
|
||||
void
|
||||
internal_function
|
||||
_dl_signal_error (int errcode,
|
||||
const char *objname,
|
||||
const char *errstring)
|
||||
_dl_signal_error (int errcode, const char *objname, const char *errstring)
|
||||
{
|
||||
struct catch *lcatch;
|
||||
|
||||
if (! errstring)
|
||||
errstring = "DYNAMIC LINKER BUG!!!";
|
||||
errstring = N_("DYNAMIC LINKER BUG!!!");
|
||||
|
||||
lcatch = tsd_getspecific ();
|
||||
if (lcatch != NULL)
|
||||
{
|
||||
/* We are inside _dl_catch_error. Return to it. We have to
|
||||
duplicate the error string since it might be allocated on the
|
||||
stack. */
|
||||
size_t objname_len = objname ? strlen (objname) + 2 : 0;
|
||||
size_t errstring_len = strlen (errstring) + 1;
|
||||
lcatch->errstring = malloc (objname_len + errstring_len);
|
||||
if (lcatch->errstring != NULL)
|
||||
{
|
||||
char *cp = lcatch->errstring;
|
||||
if (objname_len > 0)
|
||||
{
|
||||
cp = __mempcpy (cp, objname, objname_len - 2);
|
||||
cp = __mempcpy (cp, ": ", 2);
|
||||
}
|
||||
memcpy (cp, errstring, errstring_len);
|
||||
}
|
||||
stack. The object name is always a string constant. */
|
||||
lcatch->objname = objname;
|
||||
lcatch->errstring = strdup (errstring);
|
||||
longjmp (lcatch->env, errcode ?: -1);
|
||||
}
|
||||
else
|
||||
@ -120,9 +109,8 @@ _dl_signal_cerror (int errcode,
|
||||
|
||||
int
|
||||
internal_function
|
||||
_dl_catch_error (char **errstring,
|
||||
void (*operate) (void *),
|
||||
void *args)
|
||||
_dl_catch_error (const char **objname, const char **errstring,
|
||||
void (*operate) (void *), void *args)
|
||||
{
|
||||
int errcode;
|
||||
struct catch *volatile old;
|
||||
@ -141,12 +129,14 @@ _dl_catch_error (char **errstring,
|
||||
tsd_setspecific (&c);
|
||||
(*operate) (args);
|
||||
tsd_setspecific (old);
|
||||
*objname = NULL;
|
||||
*errstring = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* We get here only if we longjmp'd out of OPERATE. */
|
||||
tsd_setspecific (old);
|
||||
*objname = c.objname;
|
||||
*errstring = c.errstring;
|
||||
return errcode == -1 ? 0 : errcode;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Handle loading and unloading shared objects for internal libc purposes.
|
||||
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Zack Weinberg <zack@rabi.columbia.edu>, 1999.
|
||||
|
||||
@ -35,14 +35,15 @@ static int
|
||||
internal_function
|
||||
dlerror_run (void (*operate) (void *), void *args)
|
||||
{
|
||||
char *last_errstring = NULL;
|
||||
const char *objname;
|
||||
const char *last_errstring = NULL;
|
||||
int result;
|
||||
|
||||
(void) _dl_catch_error (&last_errstring, operate, args);
|
||||
(void) _dl_catch_error (&objname, &last_errstring, operate, args);
|
||||
|
||||
result = last_errstring != NULL;
|
||||
if (result)
|
||||
free (last_errstring);
|
||||
free ((char *) last_errstring);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <elf.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
@ -62,10 +63,8 @@
|
||||
#include <endian.h>
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
# define byteorder ELFDATA2MSB
|
||||
# define byteorder_name "big-endian"
|
||||
#elif BYTE_ORDER == LITTLE_ENDIAN
|
||||
# define byteorder ELFDATA2LSB
|
||||
# define byteorder_name "little-endian"
|
||||
#else
|
||||
# error "Unknown BYTE_ORDER " BYTE_ORDER
|
||||
# define byteorder ELFDATANONE
|
||||
@ -315,7 +314,7 @@ add_name_to_object (struct link_map *l, const char *name)
|
||||
if (newname == NULL)
|
||||
{
|
||||
/* No more memory. */
|
||||
_dl_signal_error (ENOMEM, name, "cannot allocate name record");
|
||||
_dl_signal_error (ENOMEM, name, N_("cannot allocate name record"));
|
||||
return;
|
||||
}
|
||||
/* The object should have a libname set from _dl_new_object. */
|
||||
@ -414,7 +413,7 @@ fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep,
|
||||
malloc (sizeof (*dirp) + ncapstr * sizeof (enum r_dir_status));
|
||||
if (dirp == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL,
|
||||
"cannot create cache for search path");
|
||||
N_("cannot create cache for search path"));
|
||||
|
||||
dirp->dirname = cp;
|
||||
dirp->dirnamelen = len;
|
||||
@ -475,7 +474,7 @@ decompose_rpath (const char *rpath, struct link_map *l, const char *what)
|
||||
malloc (sizeof (*result));
|
||||
if (result == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL,
|
||||
"cannot create cache for search path");
|
||||
N_("cannot create cache for search path"));
|
||||
result[0] = NULL;
|
||||
|
||||
return result;
|
||||
@ -487,7 +486,7 @@ decompose_rpath (const char *rpath, struct link_map *l, const char *what)
|
||||
string tokens. */
|
||||
copy = expand_dynamic_string_token (l, rpath);
|
||||
if (copy == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL, "cannot create RUNPATH/RPATH copy");
|
||||
_dl_signal_error (ENOMEM, NULL, N_("cannot create RUNPATH/RPATH copy"));
|
||||
|
||||
/* Count the number of necessary elements in the result array. */
|
||||
nelems = 0;
|
||||
@ -500,7 +499,7 @@ decompose_rpath (const char *rpath, struct link_map *l, const char *what)
|
||||
result = (struct r_search_path_elem **) malloc ((nelems + 1 + 1)
|
||||
* sizeof (*result));
|
||||
if (result == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL, "cannot create cache for search path");
|
||||
_dl_signal_error (ENOMEM, NULL, N_("cannot create cache for search path"));
|
||||
|
||||
return fillin_rpath (copy, result, ":", 0, what, where);
|
||||
}
|
||||
@ -530,7 +529,7 @@ _dl_init_paths (const char *llp)
|
||||
malloc ((sizeof (system_dirs_len) / sizeof (system_dirs_len[0]) + 1)
|
||||
* sizeof (struct r_search_path_elem *));
|
||||
if (rtld_search_dirs == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL, "cannot create search path array");
|
||||
_dl_signal_error (ENOMEM, NULL, N_("cannot create search path array"));
|
||||
|
||||
round_size = ((2 * sizeof (struct r_search_path_elem) - 1
|
||||
+ ncapstr * sizeof (enum r_dir_status))
|
||||
@ -540,7 +539,7 @@ _dl_init_paths (const char *llp)
|
||||
malloc ((sizeof (system_dirs) / sizeof (system_dirs[0]))
|
||||
* round_size * sizeof (struct r_search_path_elem));
|
||||
if (rtld_search_dirs[0] == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL, "cannot create cache for search path");
|
||||
_dl_signal_error (ENOMEM, NULL, N_("cannot create cache for search path"));
|
||||
|
||||
pelem = all_dirs = rtld_search_dirs[0];
|
||||
strp = system_dirs;
|
||||
@ -632,7 +631,7 @@ _dl_init_paths (const char *llp)
|
||||
malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
|
||||
if (env_path_list == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL,
|
||||
"cannot create cache for search path");
|
||||
N_("cannot create cache for search path"));
|
||||
|
||||
(void) fillin_rpath (local_strdup (llp), env_path_list, ":;",
|
||||
__libc_enable_secure, "LD_LIBRARY_PATH", NULL);
|
||||
@ -720,7 +719,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
fixed|MAP_COPY|MAP_FILE,
|
||||
fd, offset);
|
||||
if (mapat == MAP_FAILED)
|
||||
LOSE (errno, "failed to map segment from shared object");
|
||||
LOSE (errno, N_("failed to map segment from shared object"));
|
||||
return mapat;
|
||||
}
|
||||
|
||||
@ -735,7 +734,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
|
||||
/* Get file information. */
|
||||
if (__fxstat (_STAT_VER, fd, &st) < 0)
|
||||
LOSE (errno, "cannot stat shared object");
|
||||
LOSE (errno, N_("cannot stat shared object"));
|
||||
|
||||
/* Look again to see if the real name matched another already loaded. */
|
||||
for (l = _dl_loaded; l; l = l->l_next)
|
||||
@ -761,7 +760,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
readbuf = alloca (_dl_pagesize);
|
||||
readlength = __libc_read (fd, readbuf, _dl_pagesize);
|
||||
if (readlength < (ssize_t) sizeof (*header))
|
||||
LOSE (errno, "cannot read file data");
|
||||
LOSE (errno, N_("cannot read file data"));
|
||||
header = (void *) readbuf;
|
||||
|
||||
/* Check the header for basic validity. */
|
||||
@ -782,29 +781,39 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
(ELFMAG3 << (EI_MAG0 * 8)))
|
||||
#endif
|
||||
)
|
||||
LOSE (0, "invalid ELF header");
|
||||
LOSE (0, N_("invalid ELF header"));
|
||||
if (header->e_ident[EI_CLASS] != ELFW(CLASS))
|
||||
LOSE (0, "ELF file class not " STRING(__ELF_NATIVE_CLASS) "-bit");
|
||||
{
|
||||
if (__ELF_NATIVE_CLASS == 32)
|
||||
LOSE (0, N_("ELF file class not 32-bit"));
|
||||
else
|
||||
LOSE (0, N_("ELF file class not 64-bit"));
|
||||
}
|
||||
if (header->e_ident[EI_DATA] != byteorder)
|
||||
LOSE (0, "ELF file data encoding not " byteorder_name);
|
||||
{
|
||||
if (BYTE_ORDER == BIG_ENDIAN)
|
||||
LOSE (0, "ELF file data encoding not big-endian");
|
||||
else
|
||||
LOSE (0, "ELF file data encoding not little-endian");
|
||||
}
|
||||
if (header->e_ident[EI_VERSION] != EV_CURRENT)
|
||||
LOSE (0, "ELF file version ident not " STRING(EV_CURRENT));
|
||||
LOSE (0, N_("ELF file version ident does not match current one"));
|
||||
/* XXX We should be able so set system specific versions which are
|
||||
allowed here. */
|
||||
if (!VALID_ELF_OSABI (header->e_ident[EI_OSABI]))
|
||||
LOSE (0, "ELF file OS ABI invalid.");
|
||||
LOSE (0, N_("ELF file OS ABI invalid."));
|
||||
if (!VALID_ELF_ABIVERSION (header->e_ident[EI_ABIVERSION]))
|
||||
LOSE (0, "ELF file ABI version invalid.");
|
||||
LOSE (0, "internal error");
|
||||
LOSE (0, N_("ELF file ABI version invalid."));
|
||||
LOSE (0, N_("internal error"));
|
||||
}
|
||||
|
||||
if (__builtin_expect (header->e_version, EV_CURRENT) != EV_CURRENT)
|
||||
LOSE (0, "ELF file version not " STRING(EV_CURRENT));
|
||||
LOSE (0, N_("ELF file version does not not match current one"));
|
||||
if (! __builtin_expect (elf_machine_matches_host (header->e_machine), 1))
|
||||
LOSE (0, "ELF file machine architecture not " ELF_MACHINE_NAME);
|
||||
LOSE (0, N_("ELF file machine architecture does not match"));
|
||||
if (__builtin_expect (header->e_phentsize, sizeof (ElfW(Phdr)))
|
||||
!= sizeof (ElfW(Phdr)))
|
||||
LOSE (0, "ELF file's phentsize not the expected size");
|
||||
LOSE (0, N_("ELF file's phentsize not the expected size"));
|
||||
|
||||
#ifndef MAP_ANON
|
||||
# define MAP_ANON 0
|
||||
@ -814,7 +823,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
if (_dl_zerofd == -1)
|
||||
{
|
||||
__close (fd);
|
||||
_dl_signal_error (errno, NULL, "cannot open zero fill device");
|
||||
_dl_signal_error (errno, NULL, N_("cannot open zero fill device"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -822,7 +831,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
/* Enter the new object in the list of loaded objects. */
|
||||
l = _dl_new_object (realname, name, l_type, loader);
|
||||
if (__builtin_expect (! l, 0))
|
||||
LOSE (ENOMEM, "cannot create shared object descriptor");
|
||||
LOSE (ENOMEM, N_("cannot create shared object descriptor"));
|
||||
l->l_opencount = 1;
|
||||
|
||||
/* Extract the remaining details we need from the ELF header
|
||||
@ -839,7 +848,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
phdr = alloca (maplength);
|
||||
__lseek (fd, SEEK_SET, header->e_phoff);
|
||||
if (__libc_read (fd, (void *) phdr, maplength) != maplength)
|
||||
LOSE (errno, "cannot read file data");
|
||||
LOSE (errno, N_("cannot read file data"));
|
||||
}
|
||||
|
||||
{
|
||||
@ -874,9 +883,10 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
/* A load command tells us to map in part of the file.
|
||||
We record the load commands and process them all later. */
|
||||
if (ph->p_align % _dl_pagesize != 0)
|
||||
LOSE (0, "ELF load command alignment not page-aligned");
|
||||
LOSE (0, N_("ELF load command alignment not page-aligned"));
|
||||
if ((ph->p_vaddr - ph->p_offset) % ph->p_align)
|
||||
LOSE (0, "ELF load command address/offset not properly aligned");
|
||||
LOSE (0,
|
||||
N_("ELF load command address/offset not properly aligned"));
|
||||
{
|
||||
struct loadcmd *c = &loadcmds[nloadcmds++];
|
||||
c->mapstart = ph->p_vaddr & ~(ph->p_align - 1);
|
||||
@ -993,7 +1003,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
/* Dag nab it. */
|
||||
if (__mprotect ((caddr_t) (zero & ~(_dl_pagesize - 1)),
|
||||
_dl_pagesize, c->prot|PROT_WRITE) < 0)
|
||||
LOSE (errno, "cannot change memory protections");
|
||||
LOSE (errno, N_("cannot change memory protections"));
|
||||
}
|
||||
memset ((void *) zero, 0, zeropage - zero);
|
||||
if ((c->prot & PROT_WRITE) == 0)
|
||||
@ -1009,7 +1019,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
c->prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
|
||||
ANONFD, 0);
|
||||
if (mapat == MAP_FAILED)
|
||||
LOSE (errno, "cannot map zero-fill pages");
|
||||
LOSE (errno, N_("cannot map zero-fill pages"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1024,7 +1034,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
ElfW(Phdr) *newp = (ElfW(Phdr) *) malloc (header->e_phnum
|
||||
* sizeof (ElfW(Phdr)));
|
||||
if (newp == NULL)
|
||||
LOSE (ENOMEM, "cannot allocate memory for program header");
|
||||
LOSE (ENOMEM, N_("cannot allocate memory for program header"));
|
||||
|
||||
l->l_phdr = memcpy (newp, phdr,
|
||||
(header->e_phnum * sizeof (ElfW(Phdr))));
|
||||
@ -1044,7 +1054,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
if (l->l_ld == 0)
|
||||
{
|
||||
if (type == ET_DYN)
|
||||
LOSE (0, "object file has no dynamic section");
|
||||
LOSE (0, N_("object file has no dynamic section"));
|
||||
}
|
||||
else
|
||||
(ElfW(Addr)) l->l_ld += l->l_addr;
|
||||
@ -1099,7 +1109,7 @@ _dl_map_object_from_fd (const char *name, int fd, char *realname,
|
||||
(struct link_map **) malloc (sizeof (struct link_map *));
|
||||
|
||||
if (l->l_symbolic_searchlist.r_list == NULL)
|
||||
LOSE (ENOMEM, "cannot create searchlist");
|
||||
LOSE (ENOMEM, N_("cannot create searchlist"));
|
||||
|
||||
l->l_symbolic_searchlist.r_list[0] = l;
|
||||
l->l_symbolic_searchlist.r_nlist = 1;
|
||||
@ -1475,7 +1485,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
||||
if ((name_copy = local_strdup (name)) == NULL
|
||||
|| (l = _dl_new_object (name_copy, name, type, loader)) == NULL)
|
||||
_dl_signal_error (ENOMEM, name,
|
||||
"cannot create shared object descriptor");
|
||||
N_("cannot create shared object descriptor"));
|
||||
/* We use an opencount of 0 as a sign for the faked entry.
|
||||
Since the descriptor is initialized with zero we do not
|
||||
have do this here.
|
||||
@ -1488,7 +1498,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
|
||||
return l;
|
||||
}
|
||||
else
|
||||
_dl_signal_error (errno, name, "cannot open shared object file");
|
||||
_dl_signal_error (errno, name, N_("cannot open shared object file"));
|
||||
}
|
||||
|
||||
return _dl_map_object_from_fd (name, fd, realname, loader, type);
|
||||
|
@ -229,6 +229,7 @@ _dl_lookup_symbol (const char *undef_name, struct link_map *undef_map,
|
||||
{
|
||||
if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
|
||||
/* We could find no value for a strong reference. */
|
||||
/* XXX We cannot translate the messages. */
|
||||
_dl_signal_cerror (0, (reference_name && reference_name[0]
|
||||
? reference_name
|
||||
: (_dl_argv[0] ?: "<main program>")),
|
||||
@ -446,6 +447,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
|
||||
{
|
||||
/* Oh, oh. The file named in the relocation entry does not
|
||||
contain the needed symbol. */
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_cerror (0, (reference_name && reference_name[0]
|
||||
? reference_name
|
||||
: (_dl_argv[0] ?: "<main program>")),
|
||||
@ -465,6 +467,7 @@ _dl_lookup_versioned_symbol (const char *undef_name,
|
||||
{
|
||||
if (*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
|
||||
/* We could find no value for a strong reference. */
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_cerror (0, (reference_name && reference_name[0]
|
||||
? reference_name
|
||||
: (_dl_argv[0] ?: "<main program>")),
|
||||
@ -594,6 +597,7 @@ _dl_lookup_versioned_symbol_skip (const char *undef_name,
|
||||
char buf[sizeof undefined_msg + len];
|
||||
__mempcpy (__mempcpy (buf, undefined_msg, sizeof undefined_msg - 1),
|
||||
undef_name, len + 1);
|
||||
/* XXX We cannot translate the messages. */
|
||||
_dl_signal_cerror (0, (reference_name && reference_name[0]
|
||||
? reference_name
|
||||
: (_dl_argv[0] ?: "<main program>")), buf);
|
||||
|
@ -102,7 +102,7 @@ dl_open_worker (void *a)
|
||||
if (__libc_enable_secure)
|
||||
/* This is an error. */
|
||||
_dl_signal_error (0, "dlopen",
|
||||
"DST not allowed in SUID/SGID programs");
|
||||
N_("DST not allowed in SUID/SGID programs"));
|
||||
|
||||
/* We have to find out from which object the caller is calling.
|
||||
Find the highest-addressed object that ADDRESS is not below. */
|
||||
@ -136,7 +136,7 @@ dl_open_worker (void *a)
|
||||
/* If the substitution failed don't try to load. */
|
||||
if (*new_file == '\0')
|
||||
_dl_signal_error (0, "dlopen",
|
||||
"empty dynamic string token substitution");
|
||||
N_("empty dynamic string token substitution"));
|
||||
|
||||
/* Now we have a new file name. */
|
||||
file = new_file;
|
||||
@ -237,7 +237,7 @@ dl_open_worker (void *a)
|
||||
_dl_global_scope_alloc = 0;
|
||||
nomem:
|
||||
_dl_signal_error (ENOMEM, new->l_libname->name,
|
||||
"cannot extend global scope");
|
||||
N_("cannot extend global scope"));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -290,12 +290,13 @@ internal_function
|
||||
_dl_open (const char *file, int mode, const void *caller)
|
||||
{
|
||||
struct dl_open_args args;
|
||||
char *errstring;
|
||||
const char *objname;
|
||||
const char *errstring;
|
||||
int errcode;
|
||||
|
||||
if ((mode & RTLD_BINDING_MASK) == 0)
|
||||
/* One of the flags must be set. */
|
||||
_dl_signal_error (EINVAL, file, _("invalid mode for dlopen()"));
|
||||
_dl_signal_error (EINVAL, file, N_("invalid mode for dlopen()"));
|
||||
|
||||
/* Make sure we are alone. */
|
||||
__libc_lock_lock (_dl_load_lock);
|
||||
@ -304,7 +305,7 @@ _dl_open (const char *file, int mode, const void *caller)
|
||||
args.mode = mode;
|
||||
args.caller = caller;
|
||||
args.map = NULL;
|
||||
errcode = _dl_catch_error (&errstring, dl_open_worker, &args);
|
||||
errcode = _dl_catch_error (&objname, &errstring, dl_open_worker, &args);
|
||||
|
||||
#ifndef MAP_COPY
|
||||
/* We must munmap() the cache file. */
|
||||
@ -327,10 +328,10 @@ _dl_open (const char *file, int mode, const void *caller)
|
||||
/* Make a local copy of the error string so that we can release the
|
||||
memory allocated for it. */
|
||||
local_errstring = strdupa (errstring);
|
||||
free (errstring);
|
||||
free ((char *) errstring);
|
||||
|
||||
/* Reraise the error. */
|
||||
_dl_signal_error (errcode, NULL, local_errstring);
|
||||
_dl_signal_error (errcode, objname, local_errstring);
|
||||
}
|
||||
|
||||
return args.map;
|
||||
|
@ -18,6 +18,7 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ldsodefs.h>
|
||||
@ -58,8 +59,8 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
& ~(_dl_pagesize - 1)));
|
||||
if (__mprotect (mapstart, mapend - mapstart,
|
||||
PROT_READ|PROT_WRITE) < 0)
|
||||
_dl_signal_error (errno, l->l_name,
|
||||
"cannot make segment writable for relocation");
|
||||
_dl_signal_error (errno, l->l_name, N_("\
|
||||
cannot make segment writable for relocation"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -138,7 +139,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
|
||||
if (__mprotect (mapstart, mapend - mapstart, prot) < 0)
|
||||
_dl_signal_error (errno, l->l_name,
|
||||
"can't restore segment prot after reloc");
|
||||
N_("can't restore segment prot after reloc"));
|
||||
|
||||
#ifdef CLEAR_CACHE
|
||||
CLEAR_CACHE (mapstart, mapend);
|
||||
@ -157,14 +158,16 @@ _dl_reloc_bad_type (struct link_map *map, uint_fast8_t type, int plt)
|
||||
extern const char _itoa_lower_digits[];
|
||||
if (plt)
|
||||
{
|
||||
char msg[] = "unexpected PLT reloc type 0x??";
|
||||
/* XXX We cannot translate the message. */
|
||||
static char msg[] = "unexpected PLT reloc type 0x??";
|
||||
msg[sizeof msg - 3] = DIGIT(type >> 4);
|
||||
msg[sizeof msg - 2] = DIGIT(type);
|
||||
_dl_signal_error (0, map->l_name, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
char msg[] = "unexpected reloc type 0x??";
|
||||
/* XXX We cannot translate the message. */
|
||||
static char msg[] = "unexpected reloc type 0x??";
|
||||
msg[sizeof msg - 3] = DIGIT(type >> 4);
|
||||
msg[sizeof msg - 2] = DIGIT(type);
|
||||
_dl_signal_error (0, map->l_name, msg);
|
||||
|
@ -21,6 +21,7 @@
|
||||
rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ldsodefs.h>
|
||||
@ -130,7 +131,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
||||
/* XXX We don't try to find the capabilities in this case. */
|
||||
result = (struct r_strlenpair *) malloc (sizeof (*result));
|
||||
if (result == NULL)
|
||||
_dl_signal_error (ENOMEM, NULL, "cannot create capability list");
|
||||
_dl_signal_error (ENOMEM, NULL, N_("cannot create capability list"));
|
||||
|
||||
result[0].str = (char *) result; /* Does not really matter. */
|
||||
result[0].len = 0;
|
||||
|
@ -63,7 +63,7 @@ _dl_sym (void *handle, const char *name, void *who)
|
||||
else
|
||||
{
|
||||
if (! match)
|
||||
_dl_signal_error (0, NULL, _("\
|
||||
_dl_signal_error (0, NULL, N_("\
|
||||
RTLD_NEXT used in code not dynamically loaded"));
|
||||
|
||||
l = match;
|
||||
@ -113,7 +113,7 @@ _dl_vsym (void *handle, const char *name, const char *version, void *who)
|
||||
match = l;
|
||||
|
||||
if (! match)
|
||||
_dl_signal_error (0, NULL, _("\
|
||||
_dl_signal_error (0, NULL, N_("\
|
||||
RTLD_NEXT used in code not dynamically loaded"));
|
||||
|
||||
l = match;
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include <elf.h>
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ldsodefs.h>
|
||||
@ -93,6 +94,7 @@ match_symbol (const char *name, ElfW(Word) hash, const char *string,
|
||||
object was linked against another version of this file. We
|
||||
only print a message if verbose output is requested. */
|
||||
if (verbose)
|
||||
/* XXX We cannot translate the messages. */
|
||||
_dl_signal_cerror (0, map->l_name,
|
||||
make_string ("\
|
||||
no version information available (required by ",
|
||||
@ -112,6 +114,7 @@ no version information available (required by ",
|
||||
{
|
||||
char buf[20];
|
||||
buf[sizeof (buf) - 1] = '\0';
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_error (0, map->l_name,
|
||||
make_string ("unsupported version ",
|
||||
_itoa_word (def->vd_version,
|
||||
@ -145,6 +148,7 @@ no version information available (required by ",
|
||||
if (__builtin_expect (weak, 1))
|
||||
{
|
||||
if (verbose)
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_cerror (0, map->l_name,
|
||||
make_string ("weak version `", string,
|
||||
"' not found (required by ", name,
|
||||
@ -152,6 +156,7 @@ no version information available (required by ",
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_cerror (0, map->l_name,
|
||||
make_string ("version `", string,
|
||||
"' not found (required by ", name, ")"));
|
||||
@ -192,6 +197,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
||||
{
|
||||
char buf[20];
|
||||
buf[sizeof (buf) - 1] = '\0';
|
||||
/* XXX We cannot translate the message. */
|
||||
_dl_signal_error (0, (*map->l_name ? map->l_name : _dl_argv[0]),
|
||||
make_string ("unsupported version ",
|
||||
_itoa_word (ent->vn_version,
|
||||
@ -282,7 +288,7 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
|
||||
if (__builtin_expect (map->l_versions == NULL, 0))
|
||||
{
|
||||
_dl_signal_error (ENOMEM, (*map->l_name ? map->l_name : _dl_argv[0]),
|
||||
"cannot allocate version reference table");
|
||||
N_("cannot allocate version reference table"));
|
||||
result = 1;
|
||||
}
|
||||
else
|
||||
|
@ -507,14 +507,15 @@ of this helper program; chances are you did not intend to run this program.\n\
|
||||
|
||||
if (__builtin_expect (mode, normal) == verify)
|
||||
{
|
||||
char *err_str = NULL;
|
||||
const char *objname;
|
||||
const char *err_str = NULL;
|
||||
struct map_args args;
|
||||
|
||||
args.str = _dl_argv[0];
|
||||
(void) _dl_catch_error (&err_str, map_doit, &args);
|
||||
if (err_str != NULL)
|
||||
(void) _dl_catch_error (&objname, &err_str, map_doit, &args);
|
||||
if (__builtin_expect (err_str != NULL, 0))
|
||||
{
|
||||
free (err_str);
|
||||
free ((char *) err_str);
|
||||
_exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
@ -36,14 +36,15 @@ extern void *_dl_sym (void *handle, const char *name, void *who)
|
||||
extern void *_dl_vsym (void *handle, const char *name, const char *version,
|
||||
void *who)
|
||||
internal_function;
|
||||
|
||||
|
||||
/* Call OPERATE, catching errors from `dl_signal_error'. If there is no
|
||||
error, *ERRSTRING is set to null. If there is an error, *ERRSTRING is
|
||||
set to a string constructed from the strings passed to _dl_signal_error,
|
||||
and the error code passed is the return value. ERRSTRING if nonzero
|
||||
and the error code passed is the return value and *OBJNAME is set to
|
||||
the object name which experienced the problems. ERRSTRING if nonzero
|
||||
points to a malloc'ed string which the caller has to free after use.
|
||||
ARGS is passed as argument to OPERATE. */
|
||||
extern int _dl_catch_error (char **errstring,
|
||||
extern int _dl_catch_error (const char **objname, const char **errstring,
|
||||
void (*operate) (void *),
|
||||
void *args)
|
||||
internal_function;
|
||||
|
@ -240,8 +240,7 @@ extern int _dl_secure;
|
||||
zero; OBJECT is the name of the problematical shared object, or null if
|
||||
it is a general problem; ERRSTRING is a string describing the specific
|
||||
problem. */
|
||||
extern void _dl_signal_error (int errcode,
|
||||
const char *object,
|
||||
extern void _dl_signal_error (int errcode, const char *object,
|
||||
const char *errstring)
|
||||
internal_function
|
||||
__attribute__ ((__noreturn__));
|
||||
|
Loading…
Reference in New Issue
Block a user