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

Cache object: 21e604207eead85685c51a7e9acd1476


[ 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.