So right now, ld.so simply exits iun various error cases, like unknown 
relocation.  This isn't great, as it's a normal exit when a linking 
failure really should be an abnormal exit as from a fatal signal.  If 
"grep" has a linking failure I want it to *die* instead of meekly 
returning non-zero.

Diff below adds three functions to make fatal error handling simpler:
 - _dl_diedie()
   This makes the process kill itself with SIGKILL via thrkill(2).  It 
   might be nicer to do SIGABRT, but that can be caught so it would need
   to be prepared to use sigaction and suddenly it seems like overkill.

 - _dl_die(fmt, ...)
   This is a printf-like function that prints a prefix of
        "ld.so: progname: "
   then the provided format, and finally it adds a newline and calls 
   _dl_diedie().  Makes reporting fatal errors trivial.
   
 - _dl_oom()
   Like _dl_die("out of memory"), for use in the common case of a
   failed malloc/etc


The rest of the diff then converts the existing "_dl_printf()+_dl_exit()" 
and "_dl_printf() + forced segfault" cases into calls to _dl_die() or 
_dl_oom() as appropriate.  Only places which already used _dl_exit() or 
tried to trigger a segfault have been changed to use these.

Tested on amd64, armv7, loongson, macppc, and sparc64 by building a 
version of libc with the 'vis' line removed from Symbols.list, then 
running 'vis' against that .so and verifying the output is something 
like:
        vis:vis: undefined symbol 'vis'
        ld.so: vis: lazy binding failed!
        Killed

Test results for other archs?  oks?


Philip


Index: dl_printf.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/dl_printf.c,v
retrieving revision 1.18
diff -u -p -r1.18 dl_printf.c
--- dl_printf.c 23 Jan 2017 13:00:09 -0000      1.18
+++ dl_printf.c 24 Jan 2017 05:16:04 -0000
@@ -56,6 +56,7 @@
 
 #include <sys/types.h>
 #include <stdarg.h>
+#include "resolve.h"           /* for __progname */
 #include "syscall.h"
 #include "util.h"
 
@@ -132,8 +133,10 @@ kdoprnt(int fd, const char *fmt, va_list
 
        for (;;) {
                while ((ch = *fmt++) != '%') {
-                       if (ch == '\0')
+                       if (ch == '\0') {
+                               _dl_flushbuf();
                                return;
+                       }
                        putcharfd(ch, fd);
                }
                lflag = 0;
@@ -221,7 +224,6 @@ reswitch:
                        putcharfd(ch, fd);
                }
        }
-       _dl_flushbuf();
 }
 
 static void
@@ -237,4 +239,31 @@ kprintn(int fd, unsigned long ul, int ba
        do {
                putcharfd(*--p, fd);
        } while (p > buf);
+}
+
+static char ldso[] = "ld.so: ";
+
+__dead void
+_dl_die(const char *fmt, ...)
+{
+       va_list ap;
+
+       _dl_printf("%s%s: ", ldso, __progname);
+       va_start(ap, fmt);
+       kdoprnt(2, fmt, ap);
+       _dl_write(2, "\n", 1);
+       va_end(ap);
+
+       _dl_diedie();
+}
+
+__dead void
+_dl_oom(void)
+{
+       static const char oom[] = ": out of memory\n";
+
+       _dl_write(2, ldso, sizeof(ldso) - 1);
+       _dl_write(2, __progname, _dl_strlen(__progname));
+       _dl_write(2, oom, sizeof(oom) - 1);
+       _dl_diedie();
 }
Index: library.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/library.c,v
retrieving revision 1.79
diff -u -p -r1.79 library.c
--- library.c   12 Aug 2016 20:39:01 -0000      1.79
+++ library.c   24 Jan 2017 05:16:04 -0000
@@ -236,7 +236,7 @@ _dl_tryload_shlib(const char *libname, i
                                res = NULL;     /* silence gcc */
                        next_load = _dl_calloc(1, sizeof(struct load_list));
                        if (next_load == NULL)
-                               _dl_exit(7);
+                               _dl_oom();
                        next_load->next = load_list;
                        load_list = next_load;
                        next_load->start = start;
Index: library_mquery.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/library_mquery.c,v
retrieving revision 1.56
diff -u -p -r1.56 library_mquery.c
--- library_mquery.c    12 Aug 2016 20:39:01 -0000      1.56
+++ library_mquery.c    24 Jan 2017 05:16:04 -0000
@@ -176,7 +176,7 @@ _dl_tryload_shlib(const char *libname, i
                        if (size != 0) {
                                ld = _dl_malloc(sizeof(struct load_list));
                                if (ld == NULL)
-                                       _dl_exit(7);
+                                       _dl_oom();
                                ld->start = NULL;
                                ld->size = size;
                                ld->moff = TRUNC_PG(phdp->p_vaddr);
@@ -191,7 +191,7 @@ _dl_tryload_shlib(const char *libname, i
                        /* This phdr has a zfod section */
                        ld = _dl_calloc(1, sizeof(struct load_list));
                        if (ld == NULL)
-                               _dl_exit(7);
+                               _dl_oom();
                        ld->start = NULL;
                        ld->size = ROUND_PG(off + phdp->p_memsz) -
                            ROUND_PG(size);
Index: library_subr.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/library_subr.c,v
retrieving revision 1.46
diff -u -p -r1.46 library_subr.c
--- library_subr.c      22 Jan 2017 01:20:36 -0000      1.46
+++ library_subr.c      24 Jan 2017 05:16:04 -0000
@@ -320,7 +320,7 @@ _dl_load_shlib(const char *libname, elf_
                char *lpath, *lname;
                lpath = _dl_strdup(libname);
                if (lpath == NULL)
-                       _dl_exit(5);
+                       _dl_oom();
                lname = _dl_strrchr(lpath, '/');
                if (lname == NULL) {
                        _dl_free(lpath);
@@ -437,7 +437,7 @@ _dl_link_dlopen(elf_object_t *dep)
 
        n = _dl_malloc(sizeof *n);
        if (n == NULL)
-               _dl_exit(5);
+               _dl_oom();
 
        n->data = dep;
        TAILQ_INSERT_TAIL(&_dlopened_child_list, n, next_sib);
@@ -500,7 +500,7 @@ _dl_link_grpref(elf_object_t *load_group
 
        n = _dl_malloc(sizeof *n);
        if (n == NULL)
-               _dl_exit(7);
+               _dl_oom();
        n->data = load_group;
        TAILQ_INSERT_TAIL(&load_object->grpref_list, n, next_sib);
        load_group->grprefcount++;
@@ -513,7 +513,7 @@ _dl_link_child(elf_object_t *dep, elf_ob
 
        n = _dl_malloc(sizeof *n);
        if (n == NULL)
-               _dl_exit(7);
+               _dl_oom();
        n->data = dep;
        TAILQ_INSERT_TAIL(&p->child_list, n, next_sib);
 
@@ -544,7 +544,7 @@ _dl_link_grpsym(elf_object_t *object, in
 
        n = _dl_malloc(sizeof *n);
        if (n == NULL)
-               _dl_exit(8);
+               _dl_oom();
        n->data = object;
        TAILQ_INSERT_TAIL(&_dl_loading_object->grpsym_list, n, next_sib);
 }
Index: loader.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/loader.c,v
retrieving revision 1.168
diff -u -p -r1.168 loader.c
--- loader.c    9 Jan 2017 22:51:04 -0000       1.168
+++ loader.c    24 Jan 2017 05:16:05 -0000
@@ -189,19 +189,14 @@ _dl_dopreload(char *paths)
        elf_object_t    *shlib;
 
        dp = paths = _dl_strdup(paths);
-       if (dp == NULL) {
-               _dl_printf("preload: out of memory");
-               _dl_exit(1);
-       }
+       if (dp == NULL)
+               _dl_oom();
 
        while ((cp = _dl_strsep(&dp, ":")) != NULL) {
                shlib = _dl_load_shlib(cp, _dl_objects, OBJTYPE_LIB,
                _dl_objects->obj_flags);
-               if (shlib == NULL) {
-                       _dl_printf("%s: can't preload library '%s'\n",
-                           __progname, cp);
-                       _dl_exit(4);
-               }
+               if (shlib == NULL)
+                       _dl_die("can't preload library '%s'", cp);
                _dl_add_object(shlib);
                _dl_link_child(shlib, _dl_objects);
        }
@@ -308,7 +303,7 @@ _dl_load_dep_libs(elf_object_t *object, 
                            sizeof(int));
 
                        if (liblist == NULL || randomlist == NULL)
-                               _dl_exit(5);
+                               _dl_oom();
 
                        for (dynp = dynobj->load_dyn, loop = 0; dynp->d_tag;
                            dynp++)
@@ -341,17 +336,15 @@ _dl_load_dep_libs(elf_object_t *object, 
                                    OBJTYPE_LIB, depflags);
                                if (depobj == 0) {
                                        if (booting) {
-                                               _dl_printf(
-                                                   "%s: can't load library 
'%s'\n",
-                                                   __progname, libname);
-                                               _dl_exit(4);
-                                       } else  {
-                                               DL_DEB(("dlopen: failed to open 
%s\n",
-                                                   libname));
-                                               _dl_free(liblist);
-                                               _dl_free(randomlist);
-                                               return (1);
+                                               _dl_die(
+                                                   "can't load library '%s'",
+                                                   libname);
                                        }
+                                       DL_DEB(("dlopen: failed to open %s\n",
+                                           libname));
+                                       _dl_free(liblist);
+                                       _dl_free(randomlist);
+                                       return (1);
                                }
                                liblist[randomlist[loop]].depobj = depobj;
                        }
@@ -458,7 +451,7 @@ _dl_boot(const char **argv, char **envp,
 
                        next_load = _dl_calloc(1, sizeof(struct load_list));
                        if (next_load == NULL)
-                               _dl_exit(5);
+                               _dl_oom();
                        next_load->next = load_list;
                        load_list = next_load;
                        next_load->start = (char *)TRUNC_PG(phdp->p_vaddr) + 
exe_loff;
@@ -466,11 +459,8 @@ _dl_boot(const char **argv, char **envp,
                        next_load->prot = PFLAGS(phdp->p_flags);
                        break;
                case PT_TLS:
-                       if (phdp->p_filesz > phdp->p_memsz) {
-                               _dl_printf("%s: invalid tls data.\n",
-                                   __progname);
-                               _dl_exit(5);
-                       }
+                       if (phdp->p_filesz > phdp->p_memsz)
+                               _dl_die("invalid tls data");
                        ptls = phdp;
                        break;
                case PT_GNU_RELRO:
@@ -491,7 +481,7 @@ _dl_boot(const char **argv, char **envp,
 
        n = _dl_malloc(sizeof *n);
        if (n == NULL)
-               _dl_exit(5);
+               _dl_oom();
        n->data = exe_obj;
        TAILQ_INSERT_TAIL(&_dlopened_child_list, n, next_sib);
        exe_obj->opencount++;
@@ -545,7 +535,7 @@ _dl_boot(const char **argv, char **envp,
        if (map_link) {
                debug_map = _dl_malloc(sizeof(*debug_map));
                if (debug_map == NULL)
-                       _dl_exit(5);
+                       _dl_oom();
                debug_map->r_version = 1;
                debug_map->r_map = (struct link_map *)_dl_objects;
                debug_map->r_brk = (Elf_Addr)_dl_debug_state;
@@ -585,7 +575,7 @@ _dl_boot(const char **argv, char **envp,
            (failed == 0) ? "success":"failed"));
 
        if (failed != 0)
-               _dl_exit(1);
+               _dl_die("relocation failed");
 
        if (_dl_traceld)
                _dl_exit(0);
Index: malloc.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/malloc.c,v
retrieving revision 1.17
diff -u -p -r1.17 malloc.c
--- malloc.c    3 Nov 2016 18:52:40 -0000       1.17
+++ malloc.c    24 Jan 2017 05:16:05 -0000
@@ -169,25 +169,10 @@ hash(void *p)
        return sum;
 }
 
-static void
+static __dead void
 wrterror(char *msg)
 {
-       char            *q = " error: ";
-       struct iovec    iov[4];
-
-       iov[0].iov_base = g_pool->func;
-       iov[0].iov_len = _dl_strlen(g_pool->func);
-       iov[1].iov_base = q;
-       iov[1].iov_len = _dl_strlen(q);
-       iov[2].iov_base = msg;
-       iov[2].iov_len = _dl_strlen(msg);
-       iov[3].iov_base = "\n";
-       iov[3].iov_len = 1;
-       _dl_write(STDERR_FILENO, iov[0].iov_base, iov[0].iov_len);
-       _dl_write(STDERR_FILENO, iov[1].iov_base, iov[1].iov_len);
-       _dl_write(STDERR_FILENO, iov[2].iov_base, iov[2].iov_len);
-       _dl_write(STDERR_FILENO, iov[3].iov_base, iov[3].iov_len);
-       _dl_exit(7);
+       _dl_die("%s error: %s", g_pool->func, msg);
 }
 
 static void
Index: reallocarray.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/reallocarray.c,v
retrieving revision 1.1
diff -u -p -r1.1 reallocarray.c
--- reallocarray.c      21 Jun 2014 08:00:23 -0000      1.1
+++ reallocarray.c      24 Jan 2017 05:16:05 -0000
@@ -31,9 +31,7 @@ void *
 _dl_reallocarray(void *optr, size_t nmemb, size_t size)
 {
        if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
-           nmemb > 0 && SIZE_MAX / nmemb < size) {
-               _dl_wrstderr("reallocarray overflow\n");
-               _dl_exit(7);
-       }
+           nmemb > 0 && SIZE_MAX / nmemb < size)
+               _dl_die("reallocarray overflow");
        return _dl_realloc(optr, size * nmemb);
 }
Index: resolve.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/resolve.c,v
retrieving revision 1.80
diff -u -p -r1.80 resolve.c
--- resolve.c   24 Jan 2017 02:37:10 -0000      1.80
+++ resolve.c   24 Jan 2017 05:16:05 -0000
@@ -258,7 +258,7 @@ _dl_finalize_object(const char *objname,
 #endif
        object = _dl_calloc(1, sizeof(elf_object_t));
        if (object == NULL)
-               _dl_exit(7);
+               _dl_oom();
        object->prev = object->next = NULL;
 
        object->load_dyn = dynp;
@@ -361,7 +361,7 @@ _dl_finalize_object(const char *objname,
        object->obj_base = obase;
        object->load_name = _dl_strdup(objname);
        if (object->load_name == NULL)
-               _dl_exit(7);
+               _dl_oom();
        object->load_object = _dl_loading_object;
        if (object->load_object == object)
                DL_DEB(("head %s\n", object->load_name));
Index: sod.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/sod.c,v
retrieving revision 1.33
diff -u -p -r1.33 sod.c
--- sod.c       29 Oct 2015 13:07:41 -0000      1.33
+++ sod.c       24 Jan 2017 05:16:05 -0000
@@ -65,7 +65,7 @@ _dl_build_sod(const char *name, struct s
        /* default is an absolute or relative path */
        sodp->sod_name = (long)_dl_strdup(name);    /* strtok is destructive */
        if (sodp->sod_name == 0)
-               _dl_exit(7);
+               _dl_oom();
        sodp->sod_library = 0;
        sodp->sod_major = sodp->sod_minor = 0;
 
@@ -124,7 +124,7 @@ _dl_build_sod(const char *name, struct s
        cp = (char *)sodp->sod_name;
        sodp->sod_name = (long)_dl_strdup(realname);
        if (sodp->sod_name == 0)
-               _dl_exit(7);
+               _dl_oom();
        _dl_free(cp);
        sodp->sod_library = 1;
        sodp->sod_major = major;
@@ -135,7 +135,7 @@ backout:
        _dl_free((char *)sodp->sod_name);
        sodp->sod_name = (long)_dl_strdup(name);
        if (sodp->sod_name == 0)
-               _dl_exit(7);
+               _dl_oom();
 }
 
 void
@@ -225,16 +225,10 @@ _dl_findhint(char *name, int major, int 
 
        while (1) {
                /* Sanity check */
-               if (bp->hi_namex >= hheader->hh_strtab_sz) {
-                       _dl_printf("Bad name index: %#x\n", bp->hi_namex);
-                       _dl_exit(7);
-                       break;
-               }
-               if (bp->hi_pathx >= hheader->hh_strtab_sz) {
-                       _dl_printf("Bad path index: %#x\n", bp->hi_pathx);
-                       _dl_exit(7);
-                       break;
-               }
+               if (bp->hi_namex >= hheader->hh_strtab_sz)
+                       _dl_die("bad name index: %#x", bp->hi_namex);
+               if (bp->hi_pathx >= hheader->hh_strtab_sz)
+                       _dl_die("bad path index: %#x", bp->hi_pathx);
 
                if (_dl_strcmp(name, hstrtab + bp->hi_namex) == 0) {
                        /* It's `name', check version numbers */
Index: trace.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/trace.c,v
retrieving revision 1.3
diff -u -p -r1.3 trace.c
--- trace.c     16 Jan 2015 16:18:07 -0000      1.3
+++ trace.c     24 Jan 2017 05:16:05 -0000
@@ -136,7 +136,7 @@ _dl_trace_parse_spec(const char *var, st
        if (end != start) {
                spec->spec = _dl_malloc(1 + end - start);
                if (spec->spec == NULL)
-                       _dl_exit(8);
+                       _dl_oom();
 
                _dl_bcopy(start, spec->spec, end - start);
                spec->spec[end - start] = '\0';
Index: util.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/util.c,v
retrieving revision 1.43
diff -u -p -r1.43 util.c
--- util.c      12 Aug 2016 20:39:01 -0000      1.43
+++ util.c      24 Jan 2017 05:16:05 -0000
@@ -55,7 +55,7 @@ __stack_smash_handler(char func[], int d
        _dl_strlcat(message, func, sizeof message);
 
        _dl_sendsyslog(message, _dl_strlen(message), LOG_CONS);
-       _dl_exit(127);
+       _dl_diedie();
 }
 
 char *
@@ -82,7 +82,7 @@ _dl_arc4randombuf(void *v, size_t buflen
        while (buflen != 0) {
                if (reserve == 0) {
                        if (_dl_getentropy(bytes, sizeof(bytes)) != 0)
-                               _dl_exit(8);
+                               _dl_die("no entropy");
                        reserve = sizeof(bytes);
                }
                if (buflen > reserve)
Index: util.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/util.h,v
retrieving revision 1.29
diff -u -p -r1.29 util.h
--- util.h      23 Jan 2017 11:04:19 -0000      1.29
+++ util.h      24 Jan 2017 05:16:05 -0000
@@ -56,6 +56,10 @@ char *_dl_realpath(const char *path, cha
 int _dl_uname(struct utsname *name);
 
 long _dl_strtol(const char *nptr, char **endptr, int base);
+
+__dead void _dl_oom(void);
+__dead void _dl_die(const char *, ...) __attribute__((format (printf, 1, 2)));
+#define _dl_diedie()   _dl_thrkill(0, 9, NULL)
 __END_HIDDEN_DECLS
 
 #define        _dl_round_page(x)       (((x) + (__LDPGSZ - 1)) & ~(__LDPGSZ - 
1))
@@ -64,17 +68,6 @@ __END_HIDDEN_DECLS
  *     The following functions are declared inline so they can
  *     be used before bootstrap linking has been finished.
  */
-static inline void
-_dl_wrstderr(const char *s)
-{
-       const char *p = s;
-       size_t n = 0;
-
-       while (*p++)
-               n++;
-       _dl_write(2, s, n);
-}
-
 static inline void *
 _dl_memset(void *dst, const int c, size_t n)
 {
Index: aarch64/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/aarch64/archdep.h,v
retrieving revision 1.3
diff -u -p -r1.3 archdep.h
--- aarch64/archdep.h   21 Jan 2017 01:15:00 -0000      1.3
+++ aarch64/archdep.h   24 Jan 2017 05:16:05 -0000
@@ -49,9 +49,6 @@ RELOC_DYN(Elf64_Rela *r, const Elf64_Sym
        } else if (ELF64_R_TYPE(r->r_info) == R_AARCH64_ABS64) {
                *p = v + s->st_value + r->r_addend;
        } else {
-#if !defined(RCRT0)
-               _dl_printf("unknown bootstrap relocation\n");
-#endif
                _dl_exit(6);
        }
 }
Index: aarch64/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/aarch64/ldasm.S,v
retrieving revision 1.1
diff -u -p -r1.1 ldasm.S
--- aarch64/ldasm.S     11 Jan 2017 14:11:27 -0000      1.1
+++ aarch64/ldasm.S     24 Jan 2017 05:16:05 -0000
@@ -154,6 +154,7 @@ DL_SYSCALL(pledge)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(sysctl)
 DL_SYSCALL2(set_tcb,__set_tcb)
+DL_SYSCALL(thrkill)
 
 DL_SYSCALL(getdents)
 
Index: aarch64/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/aarch64/rtld_machine.c,v
retrieving revision 1.2
diff -u -p -r1.2 rtld_machine.c
--- aarch64/rtld_machine.c      23 Jan 2017 10:30:15 -0000      1.2
+++ aarch64/rtld_machine.c      24 Jan 2017 05:16:05 -0000
@@ -120,10 +120,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (rels == NULL)
                return(0);
 
-       if (relrel > numrel) {
-               _dl_printf("relcount > numrel: %ld > %ld\n", relrel, numrel);
-               _dl_exit(20);
-       }
+       if (relrel > numrel)
+               _dl_die("relcount > numrel: %ld > %ld", relrel, numrel);
 
        /*
         * unprotect some segments if we need it.
@@ -143,10 +141,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELCOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELCOUNT wrong");
 #endif
                where = (Elf_Addr *)(rels->r_offset + loff);
                *where += loff;
@@ -159,14 +155,10 @@ _dl_md_reloc(elf_object_t *object, int r
 
                type = ELF_R_TYPE(rels->r_info);
 
-               if (type >= nitems(reloc_target_flags)) {
-                       _dl_printf(" bad relocation %ld %d\n", i, type);
-                       _dl_exit(1);
-               }
-               if ((reloc_target_flags[type] & _RF_V)==0) {
-                       _dl_printf(" bad relocation %ld %d\n", i, type);
-                       _dl_exit(1);
-               }
+               if (type >= nitems(reloc_target_flags) ||
+                   (reloc_target_flags[type] & _RF_V) == 0)
+                       _dl_die("bad relocation %ld %d", i, type);
+
                if (type == R_TYPE(NONE))
                        continue;
 
@@ -349,10 +341,8 @@ _dl_bind(elf_object_t *object, int relid
        this = NULL;
        ooff = _dl_find_symbol(symn,  &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: aarch64/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/aarch64/syscall.h,v
retrieving revision 1.2
diff -u -p -r1.2 syscall.h
--- aarch64/syscall.h   21 Jan 2017 01:15:00 -0000      1.2
+++ aarch64/syscall.h   24 Jan 2017 05:16:05 -0000
@@ -58,6 +58,8 @@ int   _dl_utrace(const char *, const void 
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
 void   _dl_set_tcb(void *);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: alpha/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/alpha/archdep.h,v
retrieving revision 1.19
diff -u -p -r1.19 archdep.h
--- alpha/archdep.h     20 Jan 2017 10:40:30 -0000      1.19
+++ alpha/archdep.h     24 Jan 2017 05:16:05 -0000
@@ -53,7 +53,6 @@ RELOC_DYN(Elf64_Rela *r, const Elf64_Sym
        } else if (ELF64_R_TYPE(r->r_info) == RELOC_GLOB_DAT) {
                *p = v + s->st_value + r->r_addend;
        } else {
-               _dl_printf("unknown bootstrap relocation\n");
                _dl_exit(6);
        }
 }
Index: alpha/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/alpha/ldasm.S,v
retrieving revision 1.38
diff -u -p -r1.38 ldasm.S
--- alpha/ldasm.S       31 Aug 2016 13:18:57 -0000      1.38
+++ alpha/ldasm.S       24 Jan 2017 05:16:05 -0000
@@ -325,5 +325,6 @@ DL_SYSCALL(read)
 DL_SYSCALL(readlink)
 DL_SYSCALL2(_syscall,__syscall)
 DL_SYSCALL(sysctl)
+DL_SYSCALL(thrkill)
 DL_SYSCALL(utrace)
 DL_SYSCALL(write)
Index: alpha/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/alpha/rtld_machine.c,v
retrieving revision 1.59
diff -u -p -r1.59 rtld_machine.c
--- alpha/rtld_machine.c        21 Jun 2016 15:25:36 -0000      1.59
+++ alpha/rtld_machine.c        24 Jan 2017 05:16:05 -0000
@@ -69,10 +69,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (relas == NULL)
                return(0);
 
-       if (relrel > numrela) {
-               _dl_printf("relacount > numrel: %ld > %ld\n", relrel, numrela);
-               _dl_exit(20);
-       }
+       if (relrel > numrela)
+               _dl_die("relacount > numrel: %ld > %ld", relrel, numrela);
 
        /*
         * unprotect some segments if we need it.
@@ -93,10 +91,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *r_addr;
 
 #ifdef DEBUG
-               if (ELF64_R_TYPE(relas->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELACOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF64_R_TYPE(relas->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELACOUNT wrong");
 #endif
 
                r_addr = (Elf64_Addr *)(relas->r_offset + loff);
@@ -180,11 +176,9 @@ _dl_printf("unaligned RELATIVE: %p type:
                case R_TYPE(NONE):
                        break;
                default:
-                       _dl_printf("%s:"
-                           " %s: unsupported relocation '%s' %d at %lx\n",
-                           __progname, object->load_name, symn,
+                       _dl_die("%s: unsupported relocation '%s' %d at %lx",
+                           object->load_name, symn,
                            ELF64_R_TYPE(relas->r_info), r_addr );
-                       _dl_exit(1);
                }
                continue;
 resolve_failed:
@@ -230,10 +224,8 @@ _dl_bind(elf_object_t *object, int relof
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value + rela->r_addend;
 
Index: alpha/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/alpha/syscall.h,v
retrieving revision 1.37
diff -u -p -r1.37 syscall.h
--- alpha/syscall.h     21 Jan 2017 01:15:00 -0000      1.37
+++ alpha/syscall.h     24 Jan 2017 05:16:05 -0000
@@ -57,5 +57,7 @@ int   _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 #endif /*__DL_SYSCALL_H__*/
Index: amd64/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/amd64/ldasm.S,v
retrieving revision 1.25
diff -u -p -r1.25 ldasm.S
--- amd64/ldasm.S       28 Aug 2016 06:15:32 -0000      1.25
+++ amd64/ldasm.S       24 Jan 2017 05:16:05 -0000
@@ -101,6 +101,7 @@ DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL2(set_tcb,__set_tcb)
 DL_SYSCALL2(_syscall,__syscall)
 DL_SYSCALL(sysctl)
+DL_SYSCALL(thrkill)
 
 1:
        /* error: result = -errno; - handled here. */
Index: amd64/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/amd64/rtld_machine.c,v
retrieving revision 1.27
diff -u -p -r1.27 rtld_machine.c
--- amd64/rtld_machine.c        23 Jan 2017 10:30:58 -0000      1.27
+++ amd64/rtld_machine.c        24 Jan 2017 05:16:05 -0000
@@ -188,10 +188,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (rels == NULL)
                return(0);
 
-       if (relrel > numrel) {
-               _dl_printf("relacount > numrel: %ld > %ld\n", relrel, numrel);
-               _dl_exit(20);
-       }
+       if (relrel > numrel)
+               _dl_die("relacount > numrel: %ld > %ld", relrel, numrel);
 
        /*
         * unprotect some segments if we need it.
@@ -209,10 +207,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELACOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELACOUNT wrong");
 #endif
                where = (Elf_Addr *)(rels->r_offset + loff);
                *where = rels->r_addend + loff;
@@ -225,10 +221,8 @@ _dl_md_reloc(elf_object_t *object, int r
 
                type = ELF_R_TYPE(rels->r_info);
 
-               if (RELOC_ERROR(type)) {
-                       _dl_printf("relocation error %d idx %ld\n", type, i);
-                       _dl_exit(20);
-               }
+               if (RELOC_ERROR(type))
+                       _dl_die("relocation error %d idx %ld", type, i);
 
                if (type == R_TYPE(NONE))
                        continue;
@@ -362,10 +356,8 @@ _dl_bind(elf_object_t *object, int index
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value + rel->r_addend;
 
Index: amd64/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/amd64/syscall.h,v
retrieving revision 1.24
diff -u -p -r1.24 syscall.h
--- amd64/syscall.h     21 Jan 2017 01:15:00 -0000      1.24
+++ amd64/syscall.h     24 Jan 2017 05:16:05 -0000
@@ -58,6 +58,8 @@ int   _dl_utrace(const char *, const void 
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
 void   _dl_set_tcb(void *);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: arm/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/arm/archdep.h,v
retrieving revision 1.11
diff -u -p -r1.11 archdep.h
--- arm/archdep.h       21 Jan 2017 01:15:00 -0000      1.11
+++ arm/archdep.h       24 Jan 2017 05:16:05 -0000
@@ -53,8 +53,6 @@ RELOC_DYN(Elf_Rel *r, const Elf_Sym *s, 
        } else if (ELF_R_TYPE(r->r_info) == R_ARM_ABS32) {
                *p += v + s->st_value;
        } else {
-               /* XXX - printf might not work here, but we give it a shot. */
-               _dl_printf("Unknown bootstrap relocation.\n");
                _dl_exit(6);
        }
 }
Index: arm/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/arm/ldasm.S,v
retrieving revision 1.24
diff -u -p -r1.24 ldasm.S
--- arm/ldasm.S 28 Aug 2016 06:15:32 -0000      1.24
+++ arm/ldasm.S 24 Jan 2017 05:16:05 -0000
@@ -134,6 +134,7 @@ DL_SYSCALL(pledge)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(sysctl)
 DL_SYSCALL2(set_tcb,__set_tcb)
+DL_SYSCALL(thrkill)
 
 DL_SYSCALL(getdents)
 
Index: arm/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/arm/rtld_machine.c,v
retrieving revision 1.24
diff -u -p -r1.24 rtld_machine.c
--- arm/rtld_machine.c  23 Jan 2017 10:30:58 -0000      1.24
+++ arm/rtld_machine.c  24 Jan 2017 05:16:05 -0000
@@ -180,10 +180,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (rels == NULL)
                return(0);
 
-       if (relrel > numrel) {
-               _dl_printf("relcount > numrel: %ld > %ld\n", relrel, numrel);
-               _dl_exit(20);
-       }
+       if (relrel > numrel)
+               _dl_die("relcount > numrel: %ld > %ld", relrel, numrel);
 
        /*
         * unprotect some segments if we need it.
@@ -203,10 +201,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELCOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELCOUNT wrong");
 #endif
                where = (Elf_Addr *)(rels->r_offset + loff);
                *where += loff;
@@ -219,10 +215,8 @@ _dl_md_reloc(elf_object_t *object, int r
 
                type = ELF_R_TYPE(rels->r_info);
 
-               if (reloc_target_flags[type] & _RF_E) {
-                       _dl_printf(" bad relocation %ld %d\n", i, type);
-                       _dl_exit(1);
-               }
+               if (reloc_target_flags[type] & _RF_E)
+                       _dl_die("bad relocation %ld %d", i, type);
                if (type == R_TYPE(NONE))
                        continue;
 
@@ -407,10 +401,8 @@ _dl_bind(elf_object_t *object, int relid
        this = NULL;
        ooff = _dl_find_symbol(symn,  &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: arm/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/arm/syscall.h,v
retrieving revision 1.24
diff -u -p -r1.24 syscall.h
--- arm/syscall.h       21 Jan 2017 01:15:00 -0000      1.24
+++ arm/syscall.h       24 Jan 2017 05:16:05 -0000
@@ -58,6 +58,8 @@ int   _dl_utrace(const char *, const void 
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
 void   _dl_set_tcb(void *);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: hppa/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/hppa/archdep.h,v
retrieving revision 1.14
diff -u -p -r1.14 archdep.h
--- hppa/archdep.h      21 Jan 2017 01:15:00 -0000      1.14
+++ hppa/archdep.h      24 Jan 2017 05:16:05 -0000
@@ -49,7 +49,6 @@ RELOC_JMPREL(Elf_RelA *r, const Elf_Sym 
                p[0] = v + s->st_value + r->r_addend;
                p[1] = (Elf_Addr)pltgot;
        } else {
-               _dl_printf("unknown bootstrap relocation\n");
                _dl_exit(5);
        }
 }
@@ -65,7 +64,6 @@ RELOC_DYN(Elf_RelA *r, const Elf_Sym *s,
        } else if (ELF_R_TYPE(r->r_info) == RELOC_PLABEL32) {
                *p = v + s->st_value + r->r_addend;
        } else {
-               _dl_printf("unknown bootstrap relocation\n");
                _dl_exit(6);
        }
 }
Index: hppa/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/hppa/ldasm.S,v
retrieving revision 1.22
diff -u -p -r1.22 ldasm.S
--- hppa/ldasm.S        28 Aug 2016 06:15:32 -0000      1.22
+++ hppa/ldasm.S        24 Jan 2017 05:16:05 -0000
@@ -284,4 +284,10 @@ ENTRY(_dl_pledge,0)
        nop
 EXIT(_dl_pledge)
 
+ENTRY(_dl_thrkill,0)
+       SYSCALL(thrkill)
+       bv      r0(rp)
+       nop
+EXIT(_dl_thrkill)
+
        .end
Index: hppa/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/hppa/rtld_machine.c,v
retrieving revision 1.35
diff -u -p -r1.35 rtld_machine.c
--- hppa/rtld_machine.c 9 Jan 2017 22:51:04 -0000       1.35
+++ hppa/rtld_machine.c 24 Jan 2017 05:16:05 -0000
@@ -91,7 +91,7 @@ _dl_md_plabel(Elf_Addr pc, Elf_Addr *sl)
        if (p == NULL) {
                p = _dl_malloc(sizeof(*p));
                if (p == NULL)
-                       _dl_exit(5);
+                       _dl_oom();
                p->pc = pc;
                p->sl = sl;
                SPLAY_INSERT(_dl_md_plabels, &_dl_md_plabel_root, p);
@@ -462,10 +462,8 @@ _dl_bind(elf_object_t *object, int relof
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        value = ooff + this->st_value + rela->r_addend;
 
Index: hppa/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/hppa/syscall.h,v
retrieving revision 1.24
diff -u -p -r1.24 syscall.h
--- hppa/syscall.h      21 Jan 2017 01:15:00 -0000      1.24
+++ hppa/syscall.h      24 Jan 2017 05:16:05 -0000
@@ -58,6 +58,8 @@ int   _dl_utrace(const char *, const void 
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
 void   _dl_set_tcb(void *);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: i386/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/i386/archdep.h,v
retrieving revision 1.18
diff -u -p -r1.18 archdep.h
--- i386/archdep.h      21 Jan 2017 01:15:00 -0000      1.18
+++ i386/archdep.h      24 Jan 2017 05:16:05 -0000
@@ -50,7 +50,6 @@ RELOC_DYN(Elf32_Rel *r, const Elf32_Sym 
        } else if (ELF32_R_TYPE(r->r_info) == RELOC_32) {
                *p += v + s->st_value;
        } else {
-               _dl_printf("unknown bootstrap relocation\n");
                _dl_exit(6);
        }
 }
Index: i386/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/i386/ldasm.S,v
retrieving revision 1.28
diff -u -p -r1.28 ldasm.S
--- i386/ldasm.S        28 Aug 2016 06:15:32 -0000      1.28
+++ i386/ldasm.S        24 Jan 2017 05:16:05 -0000
@@ -97,6 +97,17 @@ __CONCAT(_dl_,n):                                            
;\
        jb      .L_cerr                                         ;\
        ret
 
+#define DL_SYSCALL(n) DL_SYSCALL2(n,n)
+#define DL_SYSCALL2(n,c)                                       \
+       .section        ".text"                                 ;\
+       .align          4                                       ;\
+       .global         __CONCAT(_dl_,n)                        ;\
+       .type           __CONCAT(_dl_,n),@function              ;\
+__CONCAT(_dl_,n):                                              ;\
+       __DO_SYSCALL(c)                                         ;\
+       jb      .L_cerr                                         ;\
+       ret
+
 DL_SYSCALL(close)
 
        .section        ".text"
@@ -108,7 +119,6 @@ _dl_exit:
        int     $0x80
        ret
 
-
 DL_SYSCALL(issetugid)
 DL_SYSCALL(getthrid)
 DL_SYSCALL2(_syscall,__syscall)
@@ -127,6 +137,7 @@ DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(sysctl)
 DL_SYSCALL(getdents)
 DL_SYSCALL2(set_tcb,__set_tcb)
+DL_SYSCALL(thrkill)
 
 .L_cerr:
        /* error: result = -errno; - handled here. */
Index: i386/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/i386/rtld_machine.c,v
retrieving revision 1.35
diff -u -p -r1.35 rtld_machine.c
--- i386/rtld_machine.c 4 Jul 2016 04:33:35 -0000       1.35
+++ i386/rtld_machine.c 24 Jan 2017 05:16:05 -0000
@@ -188,10 +188,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (rels == NULL)
                return(0);
 
-       if (relrel > numrel) {
-               _dl_printf("relcount > numrel: %ld > %ld\n", relrel, numrel);
-               _dl_exit(20);
-       }
+       if (relrel > numrel)
+               _dl_die("relcount > numrel: %ld > %ld", relrel, numrel);
 
        /*
         * unprotect some segments if we need it.
@@ -209,10 +207,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELCOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELCOUNT wrong");
 #endif
                where = (Elf_Addr *)(rels->r_offset + loff);
                *where += loff;
@@ -386,10 +382,8 @@ _dl_bind(elf_object_t *object, int index
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: i386/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/i386/syscall.h,v
retrieving revision 1.28
diff -u -p -r1.28 syscall.h
--- i386/syscall.h      21 Jan 2017 01:15:00 -0000      1.28
+++ i386/syscall.h      24 Jan 2017 05:16:05 -0000
@@ -58,6 +58,8 @@ int   _dl_utrace(const char *, const void 
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
 void   _dl_set_tcb(void *);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: m88k/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/m88k/archdep.h,v
retrieving revision 1.4
diff -u -p -r1.4 archdep.h
--- m88k/archdep.h      20 Jan 2017 10:40:30 -0000      1.4
+++ m88k/archdep.h      24 Jan 2017 05:16:05 -0000
@@ -49,8 +49,6 @@ RELOC_DYN(Elf32_Rela *r, const Elf32_Sym
        if (ELF32_R_TYPE(r->r_info) == RELOC_BBASED_32) {
                *p = v + r->r_addend;
        } else {
-               /* _dl_printf("Unexpected bootstrap relocation (%d).\n",
-                   ELF32_R_TYPE(r->r_info)); */
                _dl_exit(6);
        }
 }
Index: m88k/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/m88k/ldasm.S,v
retrieving revision 1.23
diff -u -p -r1.23 ldasm.S
--- m88k/ldasm.S        28 Aug 2016 06:15:32 -0000      1.23
+++ m88k/ldasm.S        24 Jan 2017 05:16:05 -0000
@@ -190,6 +190,7 @@ DL_SYSCALL(pledge)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(sysctl)
 DL_SYSCALL(getdents)
+DL_SYSCALL(thrkill)
 
 ENTRY(_dl_cerror)
        jmp.n   %r1
Index: m88k/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/m88k/rtld_machine.c,v
retrieving revision 1.17
diff -u -p -r1.17 rtld_machine.c
--- m88k/rtld_machine.c 16 Sep 2016 02:20:08 -0000      1.17
+++ m88k/rtld_machine.c 24 Jan 2017 05:16:05 -0000
@@ -87,10 +87,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (relas == NULL)
                return(0);
 
-       if (relrela > numrela) {
-               _dl_printf("relacount > numrel: %d > %d\n", relrela, numrela);
-               _dl_exit(20);
-       }
+       if (relrela > numrela)
+               _dl_die("relacount > numrel: %d > %d", relrela, numrela);
 
        /*
         * Change protection of all write protected segments in the object
@@ -221,13 +219,10 @@ _dl_md_reloc(elf_object_t *object, int r
                case RELOC_DISP26:
                        newval = prev_ooff + addend;
                        newval -= (Elf_Addr)r_addr;
-                       if ((newval >> 28) != 0 && (newval >> 28) != 0x0f) {
-                               _dl_printf("%s: %s: out of range DISP26"
+                       if ((newval >> 28) != 0 && (newval >> 28) != 0x0f)
+                               _dl_die("%s: out of range DISP26"
                                    " relocation to '%s' at %x\n",
-                                   __progname, object->load_name, symn,
-                                   r_addr);
-                               _dl_exit(1);
-                       }
+                                   object->load_name, symn, r_addr);
                        *r_addr = (*r_addr & 0xfc000000) |
                            (((int32_t)newval >> 2) & 0x03ffffff);
                        _dl_cacheflush((unsigned long)r_addr, 4);
@@ -241,10 +236,8 @@ _dl_md_reloc(elf_object_t *object, int r
                        *r_addr = newval;
                        break;
                default:
-                       _dl_printf("%s:"
-                           " %s: unsupported relocation '%s' %d at %x\n",
-                           __progname, object->load_name, symn, type, r_addr);
-                       _dl_exit(1);
+                       _dl_die("%s: unsupported relocation '%s' %d at %x\n",
+                           object->load_name, symn, type, r_addr);
                }
        }
 
@@ -381,10 +374,8 @@ _dl_bind(elf_object_t *object, int relof
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL | SYM_WARNNOTFOUND | SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: m88k/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/m88k/syscall.h,v
retrieving revision 1.20
diff -u -p -r1.20 syscall.h
--- m88k/syscall.h      21 Jan 2017 01:15:00 -0000      1.20
+++ m88k/syscall.h      24 Jan 2017 05:16:05 -0000
@@ -57,6 +57,8 @@ int   _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: mips64/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/mips64/ldasm.S,v
retrieving revision 1.21
diff -u -p -r1.21 ldasm.S
--- mips64/ldasm.S      28 Aug 2016 06:15:32 -0000      1.21
+++ mips64/ldasm.S      24 Jan 2017 05:16:05 -0000
@@ -168,3 +168,4 @@ DL_SYSCALL2_NOERR(set_tcb,__set_tcb)
 DL_SYSCALL(sysctl)
 DL_SYSCALL(utrace)
 DL_SYSCALL(write)
+DL_SYSCALL(thrkill)
Index: mips64/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/mips64/rtld_machine.c,v
retrieving revision 1.23
diff -u -p -r1.23 rtld_machine.c
--- mips64/rtld_machine.c       23 Jan 2017 10:30:58 -0000      1.23
+++ mips64/rtld_machine.c       24 Jan 2017 05:16:05 -0000
@@ -141,9 +141,8 @@ _dl_md_reloc(elf_object_t *object, int r
                        break;
 
                default:
-                       _dl_printf("%s: unsupported relocation '%d'\n",
-                           __progname, ELF64_R_TYPE(relocs->r_info));
-                       _dl_exit(1);
+                       _dl_die("unsupported relocation '%d'",
+                           ELF64_R_TYPE(relocs->r_info));
                }
        }
        DL_DEB(("done %d fails\n", fails));
@@ -284,10 +283,8 @@ _dl_bind(elf_object_t *object, int symid
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: mips64/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/mips64/syscall.h,v
retrieving revision 1.26
diff -u -p -r1.26 syscall.h
--- mips64/syscall.h    21 Jan 2017 01:15:00 -0000      1.26
+++ mips64/syscall.h    24 Jan 2017 05:16:05 -0000
@@ -57,6 +57,8 @@ int   _dl_sysctl(const int *, u_int, void 
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: powerpc/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/powerpc/archdep.h,v
retrieving revision 1.20
diff -u -p -r1.20 archdep.h
--- powerpc/archdep.h   20 Jan 2017 10:40:30 -0000      1.20
+++ powerpc/archdep.h   24 Jan 2017 05:16:05 -0000
@@ -74,8 +74,6 @@ RELOC_DYN(Elf32_Rela *r, const Elf32_Sym
        } else if (ELF32_R_TYPE((r)->r_info) == RELOC_GLOB_DAT) {
                *p = v + s->st_value + r->r_addend;
        } else {
-               /* XXX - printf might not work here, but we give it a shot. */
-               _dl_printf("Unknown bootstrap relocation.\n");
                _dl_exit(6);
        }
 }
Index: powerpc/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/powerpc/ldasm.S,v
retrieving revision 1.30
diff -u -p -r1.30 ldasm.S
--- powerpc/ldasm.S     28 Aug 2016 06:15:32 -0000      1.30
+++ powerpc/ldasm.S     24 Jan 2017 05:16:05 -0000
@@ -159,5 +159,6 @@ DL_SYSCALL(read)
 DL_SYSCALL(readlink)
 DL_SYSCALL2(_syscall,__syscall)
 DL_SYSCALL(sysctl)
+DL_SYSCALL(thrkill)
 DL_SYSCALL(utrace)
 DL_SYSCALL(write)
Index: powerpc/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/powerpc/rtld_machine.c,v
retrieving revision 1.60
diff -u -p -r1.60 rtld_machine.c
--- powerpc/rtld_machine.c      23 Jan 2017 10:30:58 -0000      1.60
+++ powerpc/rtld_machine.c      24 Jan 2017 05:16:05 -0000
@@ -111,10 +111,8 @@ _dl_printf("object relocation size %x, n
        if (relas == NULL)
                return(0);
 
-       if (relrel > numrela) {
-               _dl_printf("relcount > numrel: %ld > %d\n", relrel, numrela);
-               _dl_exit(20);
-       }
+       if (relrel > numrela)
+               _dl_die("relcount > numrel: %ld > %d", relrel, numrela);
 
        pltresolve = NULL;
        pltcall = NULL;
@@ -192,18 +190,14 @@ _dl_printf("object relocation size %x, n
 #ifdef DEBUG
                const Elf32_Sym *sym;
 
-               if (ELF32_R_TYPE(relas->r_info) != RELOC_RELATIVE) {
-                       _dl_printf("RELCOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF32_R_TYPE(relas->r_info) != RELOC_RELATIVE)
+                       _dl_die("RELCOUNT wrong");
                sym = object->dyn.symtab;
                sym += ELF32_R_SYM(relas->r_info);
                if (ELF32_ST_BIND(sym->st_info) != STB_LOCAL ||
                    (ELF32_ST_TYPE(sym->st_info) != STT_SECTION &&
-                   ELF32_ST_TYPE(sym->st_info) != STT_NOTYPE)) {
-                       _dl_printf("RELATIVE relocation against symbol\n");
-                       _dl_exit(20);
-               }
+                   ELF32_ST_TYPE(sym->st_info) != STT_NOTYPE))
+                       _dl_die("RELATIVE relocation against symbol");
 #endif
                r_addr = (Elf_Addr *)(relas->r_offset + loff);
                *r_addr = loff + relas->r_addend;
@@ -344,9 +338,11 @@ _dl_printf(" symn [%s] val 0x%x\n", symn
                    {
                        Elf32_Addr val = ooff + prev_value +
                            relas->r_addend - (Elf32_Addr)r_addr;
-                       if (!B24_VALID_RANGE(val)){
+                       if (!B24_VALID_RANGE(val)) {
                                /* invalid offset */
-                               _dl_exit(20);
+                               _dl_die("%s: invalid %s offset %x at %p",
+                                   object->load_name, "REL24", val,
+                                   (char *)r_addr);
                        }
                        val &= ~0xfc000003;
                        val |= (*r_addr & 0xfc000003);
@@ -402,7 +398,9 @@ _dl_printf(" symn [%s] val 0x%x\n", symn
                        if (((val & 0xffff8000) != 0) &&
                            ((val & 0xffff8000) != 0xffff8000)) {
                                /* invalid offset */
-                               _dl_exit(20);
+                               _dl_die("%s: invalid %s offset %x at %p",
+                                   object->load_name, "REL14", val,
+                                   (char *)r_addr);
                        }
                        val &= ~0xffff0003;
                        val |= (*r_addr & 0xffff0003);
@@ -458,11 +456,9 @@ _dl_printf(" found other symbol at %x si
                        break;
 
                default:
-                       _dl_printf("%s:"
-                           " %s: unsupported relocation '%s' %d at %p\n",
-                           __progname, object->load_name, symn,
+                       _dl_die("%s: unsupported relocation '%s' %d at %p\n",
+                           object->load_name, symn,
                            ELF32_R_TYPE(relas->r_info), (char *)r_addr );
-                       _dl_exit(1);
                }
        }
 
@@ -615,10 +611,8 @@ _dl_bind(elf_object_t *object, int relof
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        value = ooff + this->st_value;
 
Index: powerpc/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/powerpc/syscall.h,v
retrieving revision 1.43
diff -u -p -r1.43 syscall.h
--- powerpc/syscall.h   28 Aug 2016 06:15:32 -0000      1.43
+++ powerpc/syscall.h   24 Jan 2017 05:16:05 -0000
@@ -58,5 +58,7 @@ int   _dl_utrace(const char *, const void 
 ssize_t        _dl_write(int, const char *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 #endif /*__DL_SYSCALL_H__*/
Index: sh/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sh/archdep.h,v
retrieving revision 1.9
diff -u -p -r1.9 archdep.h
--- sh/archdep.h        21 Jan 2017 01:15:00 -0000      1.9
+++ sh/archdep.h        24 Jan 2017 05:16:05 -0000
@@ -51,8 +51,6 @@ RELOC_DYN(Elf32_Rela *r, const Elf32_Sym
        } else if (ELF_R_TYPE(r->r_info) == R_SH_DIR32) {
                *p = s->st_value + v + r->r_addend;
        } else {
-               /* XXX - printf might not work here, but we give it a shot. */
-               _dl_printf("Unknown bootstrap relocation.\n");
                _dl_exit(6);
        }
 }
Index: sh/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/sh/ldasm.S,v
retrieving revision 1.27
diff -u -p -r1.27 ldasm.S
--- sh/ldasm.S  31 Aug 2016 13:18:57 -0000      1.27
+++ sh/ldasm.S  24 Jan 2017 05:16:05 -0000
@@ -149,6 +149,7 @@ __CONCAT(_dl_,n):                                   ;\
        rts                                             ;\
         nop
 
+#define DL_SYSCALL_NOERR(n) DL_SYSCALL2_NOERR(n,n)
 #define DL_SYSCALL2_NOERR(n,c)                         \
        .global         __CONCAT(_dl_,n)                ;\
        .type           __CONCAT(_dl_,n)%function       ;\
@@ -171,8 +172,9 @@ _dl_exit:
        bra 1b
         nop
 
-DL_SYSCALL(issetugid)
-DL_SYSCALL(getthrid)
+DL_SYSCALL_NOERR(issetugid)
+DL_SYSCALL_NOERR(getthrid)
+DL_SYSCALL(thrkill)
 DL_SYSCALL2(_syscall,__syscall)
 DL_SYSCALL(munmap)
 DL_SYSCALL(mprotect)
Index: sh/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/sh/rtld_machine.c,v
retrieving revision 1.24
diff -u -p -r1.24 rtld_machine.c
--- sh/rtld_machine.c   21 Jun 2016 15:25:38 -0000      1.24
+++ sh/rtld_machine.c   24 Jan 2017 05:16:05 -0000
@@ -618,10 +618,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (rels == NULL)
                return(0);
 
-       if (relrel > numrela) {
-               _dl_printf("relacount > numrel: %ld > %ld\n", relrel, numrela);
-               _dl_exit(20);
-       }
+       if (relrel > numrela)
+               _dl_die("relacount > numrel: %ld > %ld", relrel, numrela);
 
        /*
         * unprotect some segments if we need it.
@@ -641,10 +639,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELACOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(rels->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELACOUNT wrong");
 #endif
                where = (Elf_Addr *)(rels->r_offset + loff);
                *where = rels->r_addend + loff;
@@ -657,10 +653,10 @@ _dl_md_reloc(elf_object_t *object, int r
 
                type = ELF_R_TYPE(rels->r_info);
 
-               if (reloc_target_flags[type] & _RF_E) {
-                       _dl_printf(" bad relocation obj %s %d %d\n", 
object->load_name, i, type);
-                       _dl_exit(1);
-               }
+               if (reloc_target_flags[type] & _RF_E)
+                       _dl_die("bad relocation obj %s %ld %d",
+                           object->load_name, i, type);
+
                if (type == R_TYPE(NONE))
                        continue;
 
@@ -858,10 +854,8 @@ _dl_bind(elf_object_t *object, int relof
        this = NULL;
        ooff = _dl_find_symbol(symn,  &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        buf.newval = ooff + this->st_value;
 
Index: sh/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sh/syscall.h,v
retrieving revision 1.23
diff -u -p -r1.23 syscall.h
--- sh/syscall.h        21 Jan 2017 01:15:00 -0000      1.23
+++ sh/syscall.h        24 Jan 2017 05:16:05 -0000
@@ -57,6 +57,8 @@ int   _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
Index: sparc64/archdep.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sparc64/archdep.h,v
retrieving revision 1.24
diff -u -p -r1.24 archdep.h
--- sparc64/archdep.h   21 Jan 2017 01:15:00 -0000      1.24
+++ sparc64/archdep.h   24 Jan 2017 05:16:05 -0000
@@ -45,8 +45,6 @@ RELOC_DYN(Elf_RelA *r, const Elf_Sym *s,
        if (ELF_R_TYPE(r->r_info) == RELOC_RELATIVE) {
                *p = v + r->r_addend;
        } else {
-               /* XXX - printf might not work here, but we give it a shot. */
-               _dl_printf("Unknown bootstrap relocation.\n");
                _dl_exit(6);
        }
 }
Index: sparc64/ldasm.S
===================================================================
RCS file: /cvs/src/libexec/ld.so/sparc64/ldasm.S,v
retrieving revision 1.44
diff -u -p -r1.44 ldasm.S
--- sparc64/ldasm.S     28 Aug 2016 06:15:33 -0000      1.44
+++ sparc64/ldasm.S     24 Jan 2017 05:16:05 -0000
@@ -341,3 +341,10 @@ _ENTRY(_dl_pledge)
        t ST_SYSCALL                            ! off to wonderland
        retl
         sub %g0, %o0, %o0                      ! error: result = -errno
+
+_ENTRY(_dl_thrkill)
+       mov SYS_thrkill | SYSCALL_G2RFLAG, %g1  ! calling sys_thrkill
+       add %o7, 8, %g2                         ! just return on success
+       t ST_SYSCALL                            ! off to wonderland
+       retl
+        sub %g0, %o0, %o0                      ! error: result = -errno
Index: sparc64/rtld_machine.c
===================================================================
RCS file: /cvs/src/libexec/ld.so/sparc64/rtld_machine.c,v
retrieving revision 1.58
diff -u -p -r1.58 rtld_machine.c
--- sparc64/rtld_machine.c      21 Jun 2016 15:25:38 -0000      1.58
+++ sparc64/rtld_machine.c      24 Jan 2017 05:16:05 -0000
@@ -225,10 +225,8 @@ _dl_md_reloc(elf_object_t *object, int r
        if (relas == NULL)
                return(0);
 
-       if (relrel > numrela) {
-               _dl_printf("relacount > numrel: %ld > %ld\n", relrel, numrela);
-               _dl_exit(20);
-       }
+       if (relrel > numrela)
+               _dl_die("relacount > numrel: %ld > %ld", relrel, numrela);
 
        /*
         * unprotect some segments if we need it.
@@ -246,10 +244,8 @@ _dl_md_reloc(elf_object_t *object, int r
                Elf_Addr *where;
 
 #ifdef DEBUG
-               if (ELF_R_TYPE(relas->r_info) != R_TYPE(RELATIVE)) {
-                       _dl_printf("RELACOUNT wrong\n");
-                       _dl_exit(20);
-               }
+               if (ELF_R_TYPE(relas->r_info) != R_TYPE(RELATIVE))
+                       _dl_die("RELACOUNT wrong");
 #endif
                where = (Elf_Addr *)(relas->r_offset + loff);
                *where = relas->r_addend + loff;
@@ -639,10 +635,8 @@ _dl_bind(elf_object_t *object, int index
        this = NULL;
        ooff = _dl_find_symbol(symn, &this,
            SYM_SEARCH_ALL|SYM_WARNNOTFOUND|SYM_PLT, sym, object, &sobj);
-       if (this == NULL) {
-               _dl_printf("lazy binding failed!\n");
-               *(volatile int *)0 = 0;         /* XXX */
-       }
+       if (this == NULL)
+               _dl_die("lazy binding failed!");
 
        newvalue = ooff + this->st_value;
 
Index: sparc64/syscall.h
===================================================================
RCS file: /cvs/src/libexec/ld.so/sparc64/syscall.h,v
retrieving revision 1.36
diff -u -p -r1.36 syscall.h
--- sparc64/syscall.h   21 Jan 2017 01:15:00 -0000      1.36
+++ sparc64/syscall.h   24 Jan 2017 05:16:05 -0000
@@ -57,6 +57,8 @@ int   _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
 int    _dl_sendsyslog(const char *, size_t, int);
+__dead
+void   _dl_thrkill(pid_t, int, void *);
 
 static inline void *
 _dl_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)

Reply via email to