xref: /freebsd/sys/kern/linker_if.m (revision 22cf89c938886d14f5796fc49f9f020c23ea8eaf)
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# Get the symbol table, returning it in **symtab.  Return the
120# number of symbols, otherwise zero.
121#
122METHOD long symtab_get {
123	linker_file_t	file;
124	const Elf_Sym	**symtab;
125};
126
127#
128# Get the string table, returning it in *strtab.  Return the
129# size (in bytes) of the string table, otherwise zero.
130#
131METHOD long strtab_get {
132	linker_file_t	file;
133	caddr_t		*strtab;
134};
135
136#
137# Load a file, returning the new linker_file_t in *result.  If
138# the class does not recognise the file type, zero should be
139# returned, without modifying *result.  If the file is
140# recognised, the file should be loaded, *result set to the new
141# file and zero returned.  If some other error is detected an
142# appropriate errno should be returned.
143#
144STATICMETHOD int load_file {
145    linker_class_t	cls;
146    const char*		filename;
147    linker_file_t*	result;
148};
149STATICMETHOD int link_preload {
150    linker_class_t	cls;
151    const char*		filename;
152    linker_file_t*	result;
153};
154METHOD int link_preload_finish {
155    linker_file_t	file;
156};
157