link_elf.c (85735) | link_elf.c (85736) |
---|---|
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 --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * | 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 --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * $FreeBSD: head/sys/kern/link_elf.c 85735 2001-10-30 15:10:16Z green $ | 26 * $FreeBSD: head/sys/kern/link_elf.c 85736 2001-10-30 15:21:45Z green $ |
27 */ 28 29#include "opt_ddb.h" 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/kernel.h> 34#include <sys/lock.h> --- 73 unchanged lines hidden (view full) --- 108static int link_elf_symbol_values(linker_file_t, c_linker_sym_t, linker_symval_t*); 109static int link_elf_search_symbol(linker_file_t, caddr_t value, 110 c_linker_sym_t* sym, long* diffp); 111 112static void link_elf_unload_file(linker_file_t); 113static void link_elf_unload_preload(linker_file_t); 114static int link_elf_lookup_set(linker_file_t, const char *, 115 void ***, void ***, int *); | 27 */ 28 29#include "opt_ddb.h" 30 31#include <sys/param.h> 32#include <sys/systm.h> 33#include <sys/kernel.h> 34#include <sys/lock.h> --- 73 unchanged lines hidden (view full) --- 108static int link_elf_symbol_values(linker_file_t, c_linker_sym_t, linker_symval_t*); 109static int link_elf_search_symbol(linker_file_t, caddr_t value, 110 c_linker_sym_t* sym, long* diffp); 111 112static void link_elf_unload_file(linker_file_t); 113static void link_elf_unload_preload(linker_file_t); 114static int link_elf_lookup_set(linker_file_t, const char *, 115 void ***, void ***, int *); |
116static int link_elf_each_function_name(linker_file_t, 117 int (*)(const char *, void *), 118 void *); |
|
116 117static kobj_method_t link_elf_methods[] = { 118 KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol), 119 KOBJMETHOD(linker_symbol_values, link_elf_symbol_values), 120 KOBJMETHOD(linker_search_symbol, link_elf_search_symbol), 121 KOBJMETHOD(linker_unload, link_elf_unload_file), 122 KOBJMETHOD(linker_load_file, link_elf_load_file), 123 KOBJMETHOD(linker_link_preload, link_elf_link_preload), 124 KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish), 125 KOBJMETHOD(linker_lookup_set, link_elf_lookup_set), | 119 120static kobj_method_t link_elf_methods[] = { 121 KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol), 122 KOBJMETHOD(linker_symbol_values, link_elf_symbol_values), 123 KOBJMETHOD(linker_search_symbol, link_elf_search_symbol), 124 KOBJMETHOD(linker_unload, link_elf_unload_file), 125 KOBJMETHOD(linker_load_file, link_elf_load_file), 126 KOBJMETHOD(linker_link_preload, link_elf_link_preload), 127 KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish), 128 KOBJMETHOD(linker_lookup_set, link_elf_lookup_set), |
129 KOBJMETHOD(linker_each_function_name, link_elf_each_function_name), |
|
126 { 0, 0 } 127}; 128 129static struct linker_class link_elf_class = { 130#if ELF_TARG_CLASS == ELFCLASS32 131 "elf32", 132#else 133 "elf64", --- 1010 unchanged lines hidden (view full) --- 1144 *stopp = stop; 1145 if (countp) 1146 *countp = count; 1147 1148out: 1149 free(setsym, M_LINKER); 1150 return error; 1151} | 130 { 0, 0 } 131}; 132 133static struct linker_class link_elf_class = { 134#if ELF_TARG_CLASS == ELFCLASS32 135 "elf32", 136#else 137 "elf64", --- 1010 unchanged lines hidden (view full) --- 1148 *stopp = stop; 1149 if (countp) 1150 *countp = count; 1151 1152out: 1153 free(setsym, M_LINKER); 1154 return error; 1155} |
1156 1157static int 1158link_elf_each_function_name(linker_file_t file, 1159 int (*callback)(const char *, void *), void *opaque) { 1160 elf_file_t ef = (elf_file_t)file; 1161 const Elf_Sym* symp; 1162 int i, error; 1163 1164 /* Exhaustive search */ 1165 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { 1166 if (symp->st_value != 0 && 1167 ELF_ST_TYPE(symp->st_info) == STT_FUNC) { 1168 error = callback(ef->ddbstrtab + symp->st_name, opaque); 1169 if (error) 1170 return (error); 1171 } 1172 } 1173 return (0); 1174} |
|