FreeBSD kernel kern code
|
#include <sys/cdefs.h>
#include "opt_ddb.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/fcntl.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/linker.h>
#include <sys/mutex.h>
#include <sys/mount.h>
#include <sys/namei.h>
#include <sys/proc.h>
#include <sys/rwlock.h>
#include <sys/sysctl.h>
#include <sys/vnode.h>
#include <machine/elf.h>
#include <net/vnet.h>
#include <security/mac/mac_framework.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <vm/pmap.h>
#include <vm/vm_extern.h>
#include <vm/vm_kern.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
#include <sys/link_elf.h>
#include "linker_if.h"
#include <kern/kern_ctf.c>
Go to the source code of this file.
Data Structures | |
struct | Elf_progent |
struct | Elf_relent |
struct | Elf_relaent |
struct | elf_file |
Typedefs | |
typedef struct elf_file * | elf_file_t |
Functions | |
__FBSDID ("$FreeBSD$") | |
static int | link_elf_link_preload (linker_class_t cls, const char *, linker_file_t *) |
static int | link_elf_link_preload_finish (linker_file_t) |
static int | link_elf_load_file (linker_class_t, const char *, linker_file_t *) |
static int | link_elf_lookup_symbol (linker_file_t, const char *, c_linker_sym_t *) |
static int | link_elf_lookup_debug_symbol (linker_file_t, const char *, c_linker_sym_t *) |
static int | link_elf_symbol_values (linker_file_t, c_linker_sym_t, linker_symval_t *) |
static int | link_elf_debug_symbol_values (linker_file_t, c_linker_sym_t, linker_symval_t *) |
static int | link_elf_search_symbol (linker_file_t, caddr_t value, c_linker_sym_t *sym, long *diffp) |
static void | link_elf_unload_file (linker_file_t) |
static int | link_elf_lookup_set (linker_file_t, const char *, void ***, void ***, int *) |
static int | link_elf_each_function_name (linker_file_t, int(*)(const char *, void *), void *) |
static int | link_elf_each_function_nameval (linker_file_t, linker_function_nameval_callback_t, void *) |
static int | link_elf_reloc_local (linker_file_t, bool) |
static long | link_elf_symtab_get (linker_file_t, const Elf_Sym **) |
static long | link_elf_strtab_get (linker_file_t, caddr_t *) |
static int | elf_obj_lookup (linker_file_t lf, Elf_Size symidx, int deps, Elf_Addr *) |
SYSCTL_BOOL (_debug, OID_AUTO, link_elf_obj_leak_locals, CTLFLAG_RWTUN, &link_elf_obj_leak_locals, 0, "Allow local symbols to participate in global module symbol resolution") | |
static int | relocate_file (elf_file_t ef) |
static void | elf_obj_cleanup_globals_cache (elf_file_t) |
static void | link_elf_error (const char *filename, const char *s) |
static void | link_elf_init (void *arg) |
SYSINIT (link_elf_obj, SI_SUB_KLD, SI_ORDER_SECOND, link_elf_init, NULL) | |
static void | link_elf_protect_range (elf_file_t ef, vm_offset_t start, vm_offset_t end, vm_prot_t prot) |
static void | link_elf_protect (elf_file_t ef) |
static void | link_elf_invoke_cbs (caddr_t addr, size_t size) |
static const char * | symbol_name (elf_file_t ef, Elf_Size r_info) |
static Elf_Addr | findbase (elf_file_t ef, int sec) |
static int | relocate_file1 (elf_file_t ef, bool ifuncs) |
static int | link_elf_lookup_symbol1 (linker_file_t lf, const char *name, c_linker_sym_t *sym, bool see_local) |
static int | link_elf_symbol_values1 (linker_file_t lf, c_linker_sym_t sym, linker_symval_t *symval, bool see_local) |
static void | link_elf_fix_link_set (elf_file_t ef) |
Variables | |
static kobj_method_t | link_elf_methods [] |
static struct linker_class | link_elf_class |
static bool | link_elf_obj_leak_locals = true |
typedef struct elf_file * elf_file_t |
__FBSDID | ( | "$FreeBSD$" | ) |
|
static |
Definition at line 1629 of file link_elf_obj.c.
References elf_file::ddbsymcnt, elf_file::ddbsymtab, and sym.
Referenced by relocate_file1().
|
static |
Definition at line 1651 of file link_elf_obj.c.
References elf_file::ddbstrtab, elf_file::ddbsymcnt, elf_file::ddbsymtab, linker_file_lookup_symbol(), res, and sym.
Referenced by link_elf_reloc_local(), and relocate_file1().
|
static |
Definition at line 1321 of file link_elf_obj.c.
References Elf_progent::addr, elf_file::nprogtab, elf_file::progtab, and Elf_progent::sec.
Referenced by link_elf_reloc_local(), and relocate_file1().
|
static |
Definition at line 1509 of file link_elf_obj.c.
References link_elf_symbol_values1(), and sym.
Referenced by link_elf_each_function_nameval().
|
static |
Definition at line 1583 of file link_elf_obj.c.
References callback, elf_file::ddbstrtab, elf_file::ddbsymtab, opaque, and symp.
|
static |
Definition at line 1604 of file link_elf_obj.c.
References callback, elf_file::ddbsymtab, link_elf_debug_symbol_values(), opaque, and symp.
|
static |
Definition at line 196 of file link_elf_obj.c.
References filename, and printf().
Referenced by link_elf_load_file(), link_elf_reloc_local(), and relocate_file1().
|
static |
Definition at line 1722 of file link_elf_obj.c.
References Elf_progent::addr, elf_file::ddbstrtab, elf_file::ddbsymcnt, elf_file::ddbsymtab, Elf_progent::name, elf_file::nprogtab, elf_file::progtab, Elf_progent::size, start, and sym.
Referenced by link_elf_reloc_local().
|
static |
Definition at line 205 of file link_elf_obj.c.
References link_elf_class, and linker_add_class().
|
static |
Definition at line 638 of file link_elf_obj.c.
References addr.
Referenced by link_elf_link_preload_finish(), link_elf_load_file(), and link_elf_unload_file().
|
static |
Definition at line 336 of file link_elf_obj.c.
References __ELF_WORD_SIZE, Elf_progent::addr, elf_file::address, elf_file::ddbstrcnt, elf_file::ddbstrtab, elf_file::ddbsymcnt, elf_file::ddbsymtab, dpcpu_alloc(), dpcpu_copy(), elf_file::e_shdr, filename, Elf_progent::flags, elf_file::lf, link_elf_class, link_elf_protect_range(), link_elf_reloc_local(), linker_file_unload(), linker_make_file(), malloc(), elf_file::modptr, Elf_progent::name, elf_file::nprogtab, Elf_relent::nrel, Elf_relaent::nrela, elf_file::nrelatab, elf_file::nreltab, preload_search_by_name(), preload_search_info(), elf_file::preloaded, printf(), elf_file::progtab, Elf_relent::rel, Elf_relaent::rela, elf_file::relatab, elf_file::reltab, result, Elf_progent::sec, Elf_relent::sec, Elf_relaent::sec, elf_file::shstrcnt, elf_file::shstrtab, Elf_progent::size, and type.
|
static |
Definition at line 654 of file link_elf_obj.c.
References elf_file::lf, link_elf_invoke_cbs(), link_elf_protect(), link_elf_reloc_local(), and relocate_file().
|
static |
Definition at line 684 of file link_elf_obj.c.
References Elf_progent::addr, elf_file::address, elf_file::ddbstrcnt, elf_file::ddbstrtab, elf_file::ddbsymcnt, elf_file::ddbsymtab, dpcpu_alloc(), dpcpu_copy(), elf_file::e_shdr, filename, Elf_progent::flags, flags, free(), link_elf_class, link_elf_error(), link_elf_invoke_cbs(), link_elf_protect(), link_elf_reloc_local(), linker_file_unload(), linker_load_dependencies(), linker_make_file(), malloc(), Elf_progent::name, nbytes, NDFREE(), elf_file::nprogtab, Elf_relent::nrel, Elf_relaent::nrela, elf_file::nrelatab, elf_file::nreltab, elf_file::object, printf(), elf_file::progtab, Elf_relent::rel, Elf_relaent::rela, elf_file::relatab, relocate_file(), elf_file::reltab, result, Elf_progent::sec, Elf_relent::sec, Elf_relaent::sec, elf_file::shstrcnt, elf_file::shstrtab, Elf_progent::size, vn_close(), vn_open(), and vn_rdwr().
|
static |
Definition at line 1469 of file link_elf_obj.c.
References link_elf_lookup_symbol1(), name, and sym.
|
static |
Definition at line 1555 of file link_elf_obj.c.
References Elf_progent::addr, count, name, Elf_progent::name, elf_file::nprogtab, elf_file::progtab, Elf_progent::size, start, and stop.
|
static |
Definition at line 1462 of file link_elf_obj.c.
References link_elf_lookup_symbol1(), link_elf_obj_leak_locals, name, and sym.
|
static |
Definition at line 1439 of file link_elf_obj.c.
References elf_file::ddbstrtab, elf_file::ddbsymtab, name, sym, and symp.
Referenced by link_elf_lookup_debug_symbol(), and link_elf_lookup_symbol().
|
static |
Definition at line 245 of file link_elf_obj.c.
References Elf_progent::addr, elf_file::address, Elf_progent::flags, elf_file::lf, link_elf_protect_range(), Elf_progent::name, elf_file::nprogtab, elf_file::preloaded, elf_file::progtab, Elf_progent::size, and start.
Referenced by link_elf_link_preload_finish(), and link_elf_load_file().
|
static |
Definition at line 213 of file link_elf_obj.c.
References elf_file::address, elf_file::lf, elf_file::preloaded, and start.
Referenced by link_elf_link_preload(), and link_elf_protect().
|
static |
Definition at line 1767 of file link_elf_obj.c.
References elf_file::ddbsymcnt, elf_file::ddbsymtab, elf_obj_lookup(), findbase(), elf_file::lf, link_elf_error(), link_elf_fix_link_set(), Elf_relent::nrel, Elf_relaent::nrela, elf_file::nrelatab, elf_file::nreltab, Elf_relent::rel, Elf_relaent::rela, elf_file::relatab, elf_file::reltab, Elf_relent::sec, Elf_relaent::sec, and sym.
Referenced by link_elf_link_preload(), link_elf_link_preload_finish(), and link_elf_load_file().
|
static |
Definition at line 1516 of file link_elf_obj.c.
References elf_file::ddbsymtab, diffp, sym, and value.
|
static |
Definition at line 1855 of file link_elf_obj.c.
References elf_file::ddbstrcnt, elf_file::ddbstrtab, and strtab.
|
static |
Definition at line 1501 of file link_elf_obj.c.
References link_elf_obj_leak_locals, link_elf_symbol_values1(), and sym.
|
static |
Definition at line 1476 of file link_elf_obj.c.
References elf_file::ddbstrtab, elf_file::ddbsymcnt, elf_file::ddbsymtab, and sym.
Referenced by link_elf_debug_symbol_values(), and link_elf_symbol_values().
|
static |
Definition at line 1844 of file link_elf_obj.c.
References elf_file::ddbsymcnt, elf_file::ddbsymtab, and symtab.
|
static |
Definition at line 1250 of file link_elf_obj.c.
References Elf_progent::addr, elf_file::address, elf_file::ctfoff, elf_file::ctftab, elf_file::ddbstrtab, elf_file::ddbsymtab, dpcpu_free(), elf_file::e_shdr, free(), link_elf_invoke_cbs(), Elf_progent::name, elf_file::nprogtab, elf_file::nrelatab, elf_file::nreltab, elf_file::object, preload_delete_name(), elf_file::preloaded, elf_file::progtab, Elf_relent::rel, Elf_relaent::rela, elf_file::relatab, elf_file::reltab, elf_file::shstrtab, Elf_progent::size, and elf_file::typoff.
|
static |
Definition at line 1428 of file link_elf_obj.c.
References relocate_file1().
Referenced by link_elf_link_preload_finish(), and link_elf_load_file().
|
static |
Definition at line 1336 of file link_elf_obj.c.
References elf_file::ddbsymcnt, elf_file::ddbsymtab, elf_obj_cleanup_globals_cache(), elf_obj_lookup(), findbase(), elf_file::lf, link_elf_error(), Elf_relent::nrel, Elf_relaent::nrela, elf_file::nrelatab, elf_file::nreltab, printf(), Elf_relent::rel, Elf_relaent::rela, elf_file::relatab, elf_file::reltab, Elf_relent::sec, Elf_relaent::sec, sym, and symbol_name().
Referenced by relocate_file().
|
static |
Definition at line 1309 of file link_elf_obj.c.
References elf_file::ddbstrtab, and elf_file::ddbsymtab.
Referenced by relocate_file1().
SYSCTL_BOOL | ( | _debug | , |
OID_AUTO | , | ||
link_elf_obj_leak_locals | , | ||
CTLFLAG_RWTUN | , | ||
& | link_elf_obj_leak_locals, | ||
0 | , | ||
"Allow local symbols to participate in global module symbol resolution" | |||
) |
SYSINIT | ( | link_elf_obj | , |
SI_SUB_KLD | , | ||
SI_ORDER_SECOND | , | ||
link_elf_init | , | ||
NULL | |||
) |
|
static |
Definition at line 178 of file link_elf_obj.c.
Referenced by link_elf_init(), link_elf_link_preload(), and link_elf_load_file().
|
static |
Definition at line 159 of file link_elf_obj.c.
|
static |
Definition at line 187 of file link_elf_obj.c.
Referenced by link_elf_lookup_symbol(), and link_elf_symbol_values().