Deleted Added
full compact
link_elf_obj.c (188440) link_elf_obj.c (192859)
1/*-
2 * Copyright (c) 1998-2000 Doug Rabson
3 * Copyright (c) 2004 Peter Wemm
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1998-2000 Doug Rabson
3 * Copyright (c) 2004 Peter Wemm
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/kern/link_elf_obj.c 188440 2009-02-10 15:50:19Z attilio $");
29__FBSDID("$FreeBSD: head/sys/kern/link_elf_obj.c 192859 2009-05-26 21:39:09Z sson $");
30
31#include "opt_ddb.h"
32#include "opt_mac.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/kernel.h>
37#include <sys/lock.h>

--- 97 unchanged lines hidden (view full) ---

135static int link_elf_lookup_set(linker_file_t, const char *,
136 void ***, void ***, int *);
137static int link_elf_each_function_name(linker_file_t,
138 int (*)(const char *, void *), void *);
139static int link_elf_each_function_nameval(linker_file_t,
140 linker_function_nameval_callback_t,
141 void *);
142static void link_elf_reloc_local(linker_file_t);
30
31#include "opt_ddb.h"
32#include "opt_mac.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/kernel.h>
37#include <sys/lock.h>

--- 97 unchanged lines hidden (view full) ---

135static int link_elf_lookup_set(linker_file_t, const char *,
136 void ***, void ***, int *);
137static int link_elf_each_function_name(linker_file_t,
138 int (*)(const char *, void *), void *);
139static int link_elf_each_function_nameval(linker_file_t,
140 linker_function_nameval_callback_t,
141 void *);
142static void link_elf_reloc_local(linker_file_t);
143static long link_elf_symtab_get(linker_file_t, Elf_Sym **);
144static long link_elf_strtab_get(linker_file_t, caddr_t *);
143
144static Elf_Addr elf_obj_lookup(linker_file_t lf, Elf_Size symidx, int deps);
145
146static kobj_method_t link_elf_methods[] = {
147 KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol),
148 KOBJMETHOD(linker_symbol_values, link_elf_symbol_values),
149 KOBJMETHOD(linker_search_symbol, link_elf_search_symbol),
150 KOBJMETHOD(linker_unload, link_elf_unload_file),
151 KOBJMETHOD(linker_load_file, link_elf_load_file),
152 KOBJMETHOD(linker_link_preload, link_elf_link_preload),
153 KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish),
154 KOBJMETHOD(linker_lookup_set, link_elf_lookup_set),
155 KOBJMETHOD(linker_each_function_name, link_elf_each_function_name),
156 KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
157 KOBJMETHOD(linker_ctf_get, link_elf_ctf_get),
145
146static Elf_Addr elf_obj_lookup(linker_file_t lf, Elf_Size symidx, int deps);
147
148static kobj_method_t link_elf_methods[] = {
149 KOBJMETHOD(linker_lookup_symbol, link_elf_lookup_symbol),
150 KOBJMETHOD(linker_symbol_values, link_elf_symbol_values),
151 KOBJMETHOD(linker_search_symbol, link_elf_search_symbol),
152 KOBJMETHOD(linker_unload, link_elf_unload_file),
153 KOBJMETHOD(linker_load_file, link_elf_load_file),
154 KOBJMETHOD(linker_link_preload, link_elf_link_preload),
155 KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish),
156 KOBJMETHOD(linker_lookup_set, link_elf_lookup_set),
157 KOBJMETHOD(linker_each_function_name, link_elf_each_function_name),
158 KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
159 KOBJMETHOD(linker_ctf_get, link_elf_ctf_get),
160 KOBJMETHOD(linker_symtab_get, link_elf_symtab_get),
161 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_obj",
164#else
165 "elf64_obj",

--- 1115 unchanged lines hidden (view full) ---

1281 /* Only do local relocs */
1282 if (ELF_ST_BIND(sym->st_info) != STB_LOCAL)
1283 continue;
1284 elf_reloc_local(lf, base, rela, ELF_RELOC_RELA,
1285 elf_obj_lookup);
1286 }
1287 }
1288}
162 { 0, 0 }
163};
164
165static struct linker_class link_elf_class = {
166#if ELF_TARG_CLASS == ELFCLASS32
167 "elf32_obj",
168#else
169 "elf64_obj",

--- 1115 unchanged lines hidden (view full) ---

1285 /* Only do local relocs */
1286 if (ELF_ST_BIND(sym->st_info) != STB_LOCAL)
1287 continue;
1288 elf_reloc_local(lf, base, rela, ELF_RELOC_RELA,
1289 elf_obj_lookup);
1290 }
1291 }
1292}
1293
1294static long
1295link_elf_symtab_get(linker_file_t lf, Elf_Sym **symtab)
1296{
1297 elf_file_t ef = (elf_file_t)lf;
1298
1299 *symtab = ef->ddbsymtab;
1300
1301 if (*symtab == NULL)
1302 return (0);
1303
1304 return (ef->ddbsymcnt);
1305}
1306
1307static long
1308link_elf_strtab_get(linker_file_t lf, caddr_t *strtab)
1309{
1310 elf_file_t ef = (elf_file_t)lf;
1311
1312 *strtab = ef->ddbstrtab;
1313
1314 if (*strtab == NULL)
1315 return (0);
1316
1317 return (ef->ddbstrcnt);
1318}