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