(linenum→info "unix/slp.c:2238")

glibc/2.7/elf/dl-conflict.c

    1: /* Resolve conflicts against already prelinked libraries.
    2:    Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4:    Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
    5: 
    6:    The GNU C Library is free software; you can redistribute it and/or
    7:    modify it under the terms of the GNU Lesser General Public License as
    8:    published by the Free Software Foundation; either version 2.1 of the
    9:    License, or (at your option) any later version.
   10: 
   11:    The GNU C Library is distributed in the hope that it will be useful,
   12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:    Lesser General Public License for more details.
   15: 
   16:    You should have received a copy of the GNU Lesser General Public
   17:    License along with the GNU C Library; see the file COPYING.LIB.  If not,
   18:    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   19:    Boston, MA 02111-1307, USA.  */
   20: 
   21: #include <errno.h>
   22: #include <libintl.h>
   23: #include <stdlib.h>
   24: #include <unistd.h>
   25: #include <ldsodefs.h>
   26: #include <sys/mman.h>
   27: #include <sys/param.h>
   28: #include <sys/types.h>
   29: #include "dynamic-link.h"
   30: 
   31: void
   32: _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
   33:                        ElfW(Rela) *conflictend)
   34: {
   35: #if ! ELF_MACHINE_NO_RELA
   36:   if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0))
   37:     _dl_debug_printf ("\nconflict processing: %s\n",
   38:                       l->l_name[0] ? l->l_name : rtld_progname);
   39: 
   40:   {
   41:     /* Do the conflict relocation of the object and library GOT and other
   42:        data.  */
   43: 
   44:     /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
   45: #define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
   46: #define RESOLVE(ref, version, flags) (*ref = NULL, 0)
   47: #define CHECK_STATIC_TLS(ref_map, sym_map) ((void) 0)
   48: #define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
   49:   do {                                                                        \
   50:     while ((resolve_conflict_map->l_map_end < (ElfW(Addr)) (r_offset))        \
   51:            || (resolve_conflict_map->l_map_start > (ElfW(Addr)) (r_offset)))  \
   52:       resolve_conflict_map = resolve_conflict_map->l_next;                    \
   53:                                                                               \
   54:     (map) = resolve_conflict_map;                                             \
   55:   } while (0)
   56: 
   57:     /* Prelinking makes no sense for anything but the main namespace.  */
   58:     assert (l->l_ns == LM_ID_BASE);
   59:     struct link_map *resolve_conflict_map __attribute__ ((__unused__))
   60:       = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
   61: 
   62: #include "dynamic-link.h"
   63: 
   64:     GL(dl_num_cache_relocations) += conflictend - conflict;
   65: 
   66:     for (; conflict < conflictend; ++conflict)
   67:       elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset);
   68:   }
   69: #endif
   70: }
Syntax (Markdown)