relocs_common.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "relocs.h"
  2. void die(char *fmt, ...)
  3. {
  4. va_list ap;
  5. va_start(ap, fmt);
  6. vfprintf(stderr, fmt, ap);
  7. va_end(ap);
  8. exit(1);
  9. }
  10. static void usage(void)
  11. {
  12. die("relocs [--abs-syms|--abs-relocs|--text|--realmode] vmlinux\n");
  13. }
  14. int main(int argc, char **argv)
  15. {
  16. int show_absolute_syms, show_absolute_relocs;
  17. int as_text, use_real_mode;
  18. const char *fname;
  19. FILE *fp;
  20. int i;
  21. unsigned char e_ident[EI_NIDENT];
  22. show_absolute_syms = 0;
  23. show_absolute_relocs = 0;
  24. as_text = 0;
  25. use_real_mode = 0;
  26. fname = NULL;
  27. for (i = 1; i < argc; i++) {
  28. char *arg = argv[i];
  29. if (*arg == '-') {
  30. if (strcmp(arg, "--abs-syms") == 0) {
  31. show_absolute_syms = 1;
  32. continue;
  33. }
  34. if (strcmp(arg, "--abs-relocs") == 0) {
  35. show_absolute_relocs = 1;
  36. continue;
  37. }
  38. if (strcmp(arg, "--text") == 0) {
  39. as_text = 1;
  40. continue;
  41. }
  42. if (strcmp(arg, "--realmode") == 0) {
  43. use_real_mode = 1;
  44. continue;
  45. }
  46. }
  47. else if (!fname) {
  48. fname = arg;
  49. continue;
  50. }
  51. usage();
  52. }
  53. if (!fname) {
  54. usage();
  55. }
  56. fp = fopen(fname, "r");
  57. if (!fp) {
  58. die("Cannot open %s: %s\n", fname, strerror(errno));
  59. }
  60. if (fread(&e_ident, 1, EI_NIDENT, fp) != EI_NIDENT) {
  61. die("Cannot read %s: %s", fname, strerror(errno));
  62. }
  63. rewind(fp);
  64. if (e_ident[EI_CLASS] == ELFCLASS64)
  65. process_64(fp, use_real_mode, as_text,
  66. show_absolute_syms, show_absolute_relocs);
  67. else
  68. process_32(fp, use_real_mode, as_text,
  69. show_absolute_syms, show_absolute_relocs);
  70. fclose(fp);
  71. return 0;
  72. }