1/*- 2 * Copyright (c) 1998-2000 Doug Rabson 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/kern/link_elf.c 192859 2009-05-26 21:39:09Z sson $"); |
29 30#include "opt_ddb.h" 31#include "opt_gdb.h" 32#include "opt_mac.h" 33 34#include <sys/param.h> 35#include <sys/systm.h> 36#ifdef GPROF --- 95 unchanged lines hidden (view full) --- 132 void ***, void ***, int *); 133static int link_elf_each_function_name(linker_file_t, 134 int (*)(const char *, void *), 135 void *); 136static int link_elf_each_function_nameval(linker_file_t, 137 linker_function_nameval_callback_t, 138 void *); 139static void link_elf_reloc_local(linker_file_t); |
140static long link_elf_symtab_get(linker_file_t, const Elf_Sym **); 141static long link_elf_strtab_get(linker_file_t, caddr_t *); |
142static Elf_Addr elf_lookup(linker_file_t lf, Elf_Size symidx, int deps); 143 144static kobj_method_t link_elf_methods[] = { 145 KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol), 146 KOBJMETHOD(linker_symbol_values, link_elf_symbol_values), 147 KOBJMETHOD(linker_search_symbol, link_elf_search_symbol), 148 KOBJMETHOD(linker_unload, link_elf_unload_file), 149 KOBJMETHOD(linker_load_file, link_elf_load_file), 150 KOBJMETHOD(linker_link_preload, link_elf_link_preload), 151 KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish), 152 KOBJMETHOD(linker_lookup_set, link_elf_lookup_set), 153 KOBJMETHOD(linker_each_function_name, link_elf_each_function_name), 154 KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval), 155 KOBJMETHOD(linker_ctf_get, link_elf_ctf_get), |
156 KOBJMETHOD(linker_symtab_get, link_elf_symtab_get), 157 KOBJMETHOD(linker_strtab_get, link_elf_strtab_get), |
158 { 0, 0 } 159}; 160 161static struct linker_class link_elf_class = { 162#if ELF_TARG_CLASS == ELFCLASS32 163 "elf32", 164#else 165 "elf64", --- 1223 unchanged lines hidden (view full) --- 1389 relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize); 1390 while (rela < relalim) { 1391 elf_reloc_local(lf, (Elf_Addr)ef->address, rela, ELF_RELOC_RELA, 1392 elf_lookup); 1393 rela++; 1394 } 1395 } 1396} |
1397 1398static long 1399link_elf_symtab_get(linker_file_t lf, const Elf_Sym **symtab) 1400{ 1401 elf_file_t ef = (elf_file_t)lf; 1402 1403 *symtab = ef->ddbsymtab; 1404 1405 if (*symtab == NULL) 1406 return (0); 1407 1408 return (ef->ddbsymcnt); 1409} 1410 1411static long 1412link_elf_strtab_get(linker_file_t lf, caddr_t *strtab) 1413{ 1414 elf_file_t ef = (elf_file_t)lf; 1415 1416 *strtab = ef->ddbstrtab; 1417 1418 if (*strtab == NULL) 1419 return (0); 1420 1421 return (ef->ddbstrcnt); 1422} |