The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/linker.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1997 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  * $FreeBSD$
   27  */
   28 
   29 #ifndef _SYS_LINKER_H_
   30 #define _SYS_LINKER_H_
   31 
   32 #ifdef KERNEL
   33 
   34 #include <machine/elf.h>
   35 
   36 #ifdef MALLOC_DECLARE
   37 MALLOC_DECLARE(M_LINKER);
   38 #endif
   39 
   40 /*
   41  * Object representing a file which has been loaded by the linker.
   42  */
   43 typedef struct linker_file* linker_file_t;
   44 typedef TAILQ_HEAD(, linker_file) linker_file_list_t;
   45 
   46 typedef caddr_t linker_sym_t;   /* opaque symbol */
   47 
   48 /*
   49  * expanded out linker_sym_t
   50  */
   51 typedef struct linker_symval {
   52     const char*         name;
   53     caddr_t             value;
   54     size_t              size;
   55 } linker_symval_t;
   56 
   57 struct linker_file_ops {
   58     /*
   59      * Lookup a symbol in the file's symbol table.  If the symbol is
   60      * not found then return ENOENT, otherwise zero.  If the symbol
   61      * found is a common symbol, return with *address set to zero and
   62      * *size set to the size of the common space required.  Otherwise
   63      * set *address the value of the symbol.
   64      */
   65     int                 (*lookup_symbol)(linker_file_t, const char* name,
   66                                          linker_sym_t* sym);
   67 
   68     int                 (*symbol_values)(linker_file_t, linker_sym_t,
   69                                          linker_symval_t*);
   70 
   71     int                 (*search_symbol)(linker_file_t, caddr_t value,
   72                                          linker_sym_t* sym, long* diffp);
   73 
   74     /*
   75      * Unload a file, releasing dependancies and freeing storage.
   76      */
   77     void                (*unload)(linker_file_t);
   78 };
   79 
   80 struct common_symbol {
   81     STAILQ_ENTRY(common_symbol) link;
   82     char*               name;
   83     caddr_t             address;
   84 };
   85 
   86 struct linker_file {
   87     int                 refs;           /* reference count */
   88     int                 userrefs;       /* kldload(2) count */
   89     int                 flags;
   90 #define LINKER_FILE_LINKED      0x1     /* file has been fully linked */
   91     TAILQ_ENTRY(linker_file) link;      /* list of all loaded files */
   92     char*               filename;       /* file which was loaded */
   93     int                 id;             /* unique id */
   94     caddr_t             address;        /* load address */
   95     size_t              size;           /* size of file */
   96     int                 ndeps;          /* number of dependancies */
   97     linker_file_t*      deps;           /* list of dependancies */
   98     STAILQ_HEAD(, common_symbol) common; /* list of common symbols */
   99     TAILQ_HEAD(, module) modules;       /* modules in this file */
  100     void*               priv;           /* implementation data */
  101 
  102     struct linker_file_ops* ops;
  103 };
  104 
  105 /*
  106  * Object implementing a class of file (a.out, elf, etc.)
  107  */
  108 typedef struct linker_class *linker_class_t;
  109 typedef TAILQ_HEAD(, linker_class) linker_class_list_t;
  110 
  111 struct linker_class_ops {
  112     /* 
  113      * Load a file, returning the new linker_file_t in *result.  If
  114      * the class does not recognise the file type, zero should be
  115      * returned, without modifying *result.  If the file is
  116      * recognised, the file should be loaded, *result set to the new
  117      * file and zero returned.  If some other error is detected an
  118      * appropriate errno should be returned.
  119      */
  120     int         (*load_file)(const char* filename, linker_file_t* result);
  121 };
  122 
  123 struct linker_class {
  124     TAILQ_ENTRY(linker_class) link;     /* list of all file classes */
  125     const char*         desc;           /* description (e.g. "a.out") */
  126     void*               priv;           /* implementation data */
  127 
  128     struct linker_class_ops *ops;
  129 };
  130 
  131 /*
  132  * The file which is currently loading.  Used to register modules with
  133  * the files which contain them.
  134  */
  135 extern linker_file_t    linker_current_file;
  136 
  137 /*
  138  * The "file" for the kernel.
  139  */
  140 extern linker_file_t    linker_kernel_file;
  141 
  142 /*
  143  * Add a new file class to the linker.
  144  */
  145 int linker_add_class(const char* desc, void* priv,
  146                      struct linker_class_ops* ops);
  147 
  148 /*
  149  * Load a file, trying each file class until one succeeds.
  150  */
  151 int linker_load_file(const char* filename, linker_file_t* result);
  152 
  153 /*
  154  * Find a currently loaded file given its filename.
  155  */
  156 linker_file_t linker_find_file_by_name(const char* filename);
  157 
  158 /*
  159  * Find a currently loaded file given its file id.
  160  */
  161 linker_file_t linker_find_file_by_id(int fileid);
  162 
  163 /*
  164  * Called from a class handler when a file is laoded.
  165  */
  166 linker_file_t linker_make_file(const char* filename, void* priv,
  167                                struct linker_file_ops* ops);
  168 
  169 /*
  170  * Unload a file, freeing up memory.
  171  */
  172 int linker_file_unload(linker_file_t file);
  173 
  174 /*
  175  * Add a dependancy to a file.
  176  */
  177 int linker_file_add_dependancy(linker_file_t file, linker_file_t dep);
  178 
  179 /*
  180  * Lookup a symbol in a file.  If deps is TRUE, look in dependancies
  181  * if not found in file.
  182  */
  183 caddr_t linker_file_lookup_symbol(linker_file_t file, const char* name, 
  184                                   int deps);
  185 
  186 /*
  187  * Search the linker path for the module.  Return the full pathname in
  188  * a malloc'ed buffer.
  189  */
  190 char *linker_search_path(const char *filename);
  191 
  192 /*
  193  * DDB Helpers, tuned specifically for ddb/db_kld.c
  194  */
  195 int linker_ddb_lookup(char *symstr, linker_sym_t *sym);
  196 int linker_ddb_search_symbol(caddr_t value, linker_sym_t *sym, long *diffp);
  197 int linker_ddb_symbol_values(linker_sym_t sym, linker_symval_t *symval);
  198 
  199 
  200 #endif  /* KERNEL */
  201 
  202 /*
  203  * Module information subtypes
  204  */
  205 #define MODINFO_END             0x0000          /* End of list */
  206 #define MODINFO_NAME            0x0001          /* Name of module (string) */
  207 #define MODINFO_TYPE            0x0002          /* Type of module (string) */
  208 #define MODINFO_ADDR            0x0003          /* Loaded address */
  209 #define MODINFO_SIZE            0x0004          /* Size of module */
  210 #define MODINFO_EMPTY           0x0005          /* Has been deleted */
  211 #define MODINFO_METADATA        0x8000          /* Module-specfic */
  212 
  213 #define MODINFOMD_AOUTEXEC      0x0001          /* a.out exec header */
  214 #define MODINFOMD_ELFHDR        0x0002          /* ELF header */
  215 #define MODINFOMD_SSYM          0x0003          /* start of symbols */
  216 #define MODINFOMD_ESYM          0x0004          /* end of symbols */
  217 #define MODINFOMD_DYNAMIC       0x0005          /* _DYNAMIC pointer */
  218 #define MODINFOMD_NOCOPY        0x8000          /* don't copy this metadata to the kernel */
  219 
  220 #define MODINFOMD_DEPLIST       (0x4001 | MODINFOMD_NOCOPY)     /* depends on */
  221 
  222 #ifdef KERNEL
  223 
  224 /*
  225  * Module lookup
  226  */
  227 extern caddr_t          preload_metadata;
  228 extern caddr_t          preload_search_by_name(const char *name);
  229 extern caddr_t          preload_search_by_type(const char *type);
  230 extern caddr_t          preload_search_next_name(caddr_t base);
  231 extern caddr_t          preload_search_info(caddr_t mod, int inf);
  232 extern void             preload_delete_name(const char *name);
  233 extern void             preload_bootstrap_relocate(vm_offset_t offset);
  234 
  235 #ifdef KLD_DEBUG
  236 
  237 extern int kld_debug;
  238 #define KLD_DEBUG_FILE  1       /* file load/unload */
  239 #define KLD_DEBUG_SYM   2       /* symbol lookup */
  240 
  241 #define KLD_DPF(cat, args)                                      \
  242         do {                                                    \
  243                 if (kld_debug & KLD_DEBUG_##cat) printf args;   \
  244         } while (0)
  245 
  246 #else
  247 
  248 #define KLD_DPF(cat, args)
  249 
  250 #endif
  251 
  252 /* Support functions */
  253 int     elf_reloc(linker_file_t lf, const void *rel, int type, const char *sym);
  254 /* values for type */
  255 #define ELF_RELOC_REL   1
  256 #define ELF_RELOC_RELA  2
  257 
  258 #endif /* KERNEL */
  259 
  260 struct kld_file_stat {
  261     int         version;        /* set to sizeof(linker_file_stat) */
  262     char        name[MAXPATHLEN];
  263     int         refs;
  264     int         id;
  265     caddr_t     address;        /* load address */
  266     size_t      size;           /* size in bytes */
  267 };
  268 
  269 struct kld_sym_lookup {
  270     int         version;        /* set to sizeof(struct kld_sym_lookup) */
  271     char        *symname;       /* Symbol name we are looking up */
  272     u_long      symvalue;
  273     size_t      symsize;
  274 };
  275 #define KLDSYM_LOOKUP   1
  276 
  277 #ifndef KERNEL
  278 
  279 #include <sys/cdefs.h>
  280 
  281 __BEGIN_DECLS
  282 int     kldload(const char* file);
  283 int     kldunload(int fileid);
  284 int     kldfind(const char* file);
  285 int     kldnext(int fileid);
  286 int     kldstat(int fileid, struct kld_file_stat* stat);
  287 int     kldfirstmod(int fileid);
  288 int     kldsym(int _fileid, int _cmd, void *_data);
  289 __END_DECLS
  290 
  291 #endif
  292 
  293 #endif /* !_SYS_LINKER_H_ */

Cache object: 8d5e8b3d42bb4f8dc888ed20d6e3d8cf


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.