modpost.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <sys/mman.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <elf.h>
  11. #include "elfconfig.h"
  12. #if KERNEL_ELFCLASS == ELFCLASS32
  13. #define Elf_Ehdr Elf32_Ehdr
  14. #define Elf_Shdr Elf32_Shdr
  15. #define Elf_Sym Elf32_Sym
  16. #define ELF_ST_BIND ELF32_ST_BIND
  17. #define ELF_ST_TYPE ELF32_ST_TYPE
  18. #else
  19. #define Elf_Ehdr Elf64_Ehdr
  20. #define Elf_Shdr Elf64_Shdr
  21. #define Elf_Sym Elf64_Sym
  22. #define ELF_ST_BIND ELF64_ST_BIND
  23. #define ELF_ST_TYPE ELF64_ST_TYPE
  24. #endif
  25. #if KERNEL_ELFDATA != HOST_ELFDATA
  26. static inline void __endian(const void *src, void *dest, unsigned int size)
  27. {
  28. unsigned int i;
  29. for (i = 0; i < size; i++)
  30. ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1];
  31. }
  32. #define TO_NATIVE(x) \
  33. ({ \
  34. typeof(x) __x; \
  35. __endian(&(x), &(__x), sizeof(__x)); \
  36. __x; \
  37. })
  38. #else /* endianness matches */
  39. #define TO_NATIVE(x) (x)
  40. #endif
  41. #define NOFAIL(ptr) do_nofail((ptr), #ptr)
  42. void *do_nofail(void *ptr, const char *expr);
  43. struct buffer {
  44. char *p;
  45. int pos;
  46. int size;
  47. };
  48. void __attribute__((format(printf, 2, 3)))
  49. buf_printf(struct buffer *buf, const char *fmt, ...);
  50. void
  51. buf_write(struct buffer *buf, const char *s, int len);
  52. struct module {
  53. struct module *next;
  54. const char *name;
  55. struct symbol *unres;
  56. int seen;
  57. int skip;
  58. int has_init;
  59. int has_cleanup;
  60. struct buffer dev_table_buf;
  61. char srcversion[25];
  62. };
  63. struct elf_info {
  64. unsigned long size;
  65. Elf_Ehdr *hdr;
  66. Elf_Shdr *sechdrs;
  67. Elf_Sym *symtab_start;
  68. Elf_Sym *symtab_stop;
  69. const char *strtab;
  70. char *modinfo;
  71. unsigned int modinfo_len;
  72. };
  73. void handle_moddevtable(struct module *mod, struct elf_info *info,
  74. Elf_Sym *sym, const char *symname);
  75. void add_moddevtable(struct buffer *buf, struct module *mod);
  76. void maybe_frob_rcs_version(const char *modfilename,
  77. char *version,
  78. void *modinfo,
  79. unsigned long modinfo_offset);
  80. void get_src_version(const char *modname, char sum[], unsigned sumlen);
  81. void *grab_file(const char *filename, unsigned long *size);
  82. char* get_next_line(unsigned long *pos, void *file, unsigned long size);
  83. void release_file(void *file, unsigned long size);