xref: /freebsd/sys/kern/linker_if.m (revision 0f996f45418e82dae151e5d1da478da38d70049f)
1#-
2# Copyright (c) 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#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13#
14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
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#
27
28#include <sys/linker.h>
29
30INTERFACE linker;
31
32#
33# Lookup a symbol in the file's symbol table.  If the symbol is not
34# found then return ENOENT, otherwise zero.
35#
36METHOD int lookup_symbol {
37    linker_file_t	file;
38    const char*		name;
39    c_linker_sym_t*	symp;
40};
41
42METHOD int lookup_debug_symbol {
43    linker_file_t	file;
44    const char*		name;
45    c_linker_sym_t*	symp;
46};
47
48METHOD int symbol_values {
49    linker_file_t	file;
50    c_linker_sym_t	sym;
51    linker_symval_t*	valp;
52};
53
54METHOD int debug_symbol_values {
55    linker_file_t	file;
56    c_linker_sym_t	sym;
57    linker_symval_t*	valp;
58};
59
60METHOD int search_symbol {
61    linker_file_t	file;
62    caddr_t		value;
63    c_linker_sym_t*	symp;
64    long*		diffp;
65};
66
67#
68# Call the callback with each specified function defined in the file.
69# Stop and return the error if the callback returns an error.
70#
71METHOD int each_function_name {
72	linker_file_t	file;
73	linker_function_name_callback_t	callback;
74	void*		opaque;
75};
76
77#
78# Call the callback with each specified function and it's value
79# defined in the file.
80# Stop and return the error if the callback returns an error.
81#
82METHOD int each_function_nameval {
83	linker_file_t	file;
84	linker_function_nameval_callback_t	callback;
85	void*		opaque;
86};
87
88#
89# Search for a linker set in a file.  Return a pointer to the first
90# entry (which is itself a pointer), and the number of entries.
91# "stop" points to the entry beyond the last valid entry.
92# If count, start or stop are NULL, they are not returned.
93#
94METHOD int lookup_set {
95    linker_file_t	file;
96    const char*		name;
97    void***		start;
98    void***		stop;
99    int*		count;
100};
101
102#
103# Unload a file, releasing dependencies and freeing storage.
104#
105METHOD void unload {
106    linker_file_t	file;
107};
108
109#
110# Load CTF data if necessary and if there is a .SUNW_ctf section
111# in the ELF file, returning info in the linker CTF structure.
112#
113METHOD int ctf_get {
114	linker_file_t	file;
115	linker_ctf_t	*lc;
116};
117
118#
119# Look up a CTF type in the file's CTF section
120# and return CTF info in the linker CTF structure.
121# Return ENOENT if typename is not found, otherwise zero.
122#
123METHOD int ctf_lookup_typename {
124  linker_file_t file;
125  linker_ctf_t *lc;
126  const char *typename;
127};
128
129#
130# Lookup a symbol in the file's symbol table and the file's CTF info.
131# Return ENOENT if either the symbol or its CTF
132# data is not loaded, otherwise return zero.
133#
134METHOD int lookup_debug_symbol_ctf {
135  linker_file_t file;
136  const char *name;
137  c_linker_sym_t *sym;
138  linker_ctf_t *lc;
139};
140
141#
142# Get the symbol table, returning it in **symtab.  Return the
143# number of symbols, otherwise zero.
144#
145METHOD long symtab_get {
146	linker_file_t	file;
147	const Elf_Sym	**symtab;
148};
149
150#
151# Get the string table, returning it in *strtab.  Return the
152# size (in bytes) of the string table, otherwise zero.
153#
154METHOD long strtab_get {
155	linker_file_t	file;
156	caddr_t		*strtab;
157};
158
159#
160# Load a file, returning the new linker_file_t in *result.  If
161# the class does not recognise the file type, zero should be
162# returned, without modifying *result.  If the file is
163# recognised, the file should be loaded, *result set to the new
164# file and zero returned.  If some other error is detected an
165# appropriate errno should be returned.
166#
167STATICMETHOD int load_file {
168    linker_class_t	cls;
169    const char*		filename;
170    linker_file_t*	result;
171};
172STATICMETHOD int link_preload {
173    linker_class_t	cls;
174    const char*		filename;
175    linker_file_t*	result;
176};
177METHOD int link_preload_finish {
178    linker_file_t	file;
179};
180
181#ifdef VIMAGE
182#
183# Propagate system tunable values to all vnets.
184#
185METHOD void propagate_vnets {
186	linker_file_t	file;
187};
188#endif
189