|
65 | 65 | #define SHIVA_MODULE_F_INIT (1UL << 1) /* deprecated, meaningless */ |
66 | 66 | #define SHIVA_MODULE_F_DUMMY_TEXT (1UL << 2) /* Module has empty text region */ |
67 | 67 | #define SHIVA_MODULE_F_TRANSFORM (1UL << 3) /* Module has transform records */ |
| 68 | +#define SHIVA_MODULE_F_DELAYED_RELOCS (1UL << 4) /* Module has delayed relocs to process */ |
68 | 69 |
|
69 | 70 | #define SHIVA_DT_NEEDED (DT_LOOS + 10) |
70 | 71 | #define SHIVA_DT_SEARCH (DT_LOOS + 11) |
|
99 | 100 | "mov x0, #0 \n" \ |
100 | 101 | "ret " \ |
101 | 102 | :: "r" (stack), "r" (addr)); |
| 103 | + |
| 104 | +#define SHIVA_ULEXEC_TARGET_TRANSFER2(entry) __asm__ __volatile__ ("mov x9, %0\n" \ |
| 105 | + "br x9" \ |
| 106 | + :: "r"(entry)); |
| 107 | + |
| 108 | +#define SHIVA_ULEXEC_TARGET_TRANSFER(entry) __asm__ __volatile__("mov x30, %0 \n" \ |
| 109 | + "ret " \ |
| 110 | + :: "r"(entry)); |
| 111 | +#define SHIVA_ULEXEC_TARGET_TRANSFER3(entry, arg0) __asm__ __volatile__ ("mov x0, %0\n" \ |
| 112 | + "mov x9, %1\n" \ |
| 113 | + "blr x9" \ |
| 114 | + :: "r"(arg0), "r"(entry)); |
| 115 | + |
102 | 116 | #endif |
103 | 117 |
|
104 | 118 | /* |
@@ -338,6 +352,22 @@ typedef struct shiva_transform { |
338 | 352 | TAILQ_ENTRY(shiva_transform) _linkage; |
339 | 353 | } shiva_transform_t; |
340 | 354 |
|
| 355 | +/* |
| 356 | + * Delayed relocatoin entries are not handled until |
| 357 | + * after ld-linux.so is completely done and passes |
| 358 | + * control back to Shiva AT_ENTRY, if needed. |
| 359 | + */ |
| 360 | +struct shiva_module_delayed_reloc { |
| 361 | + uint8_t *rel_unit; |
| 362 | + uint64_t rel_addr; |
| 363 | + uint64_t symval; /* The symbols value */ |
| 364 | + struct elf_relocation rel; /* Original relocation: (May be updated/modified by Transforms though) */ |
| 365 | + uint64_t flags; |
| 366 | + char *symname; |
| 367 | + char so_path[PATH_MAX]; |
| 368 | + TAILQ_ENTRY(shiva_module_delayed_reloc) _linkage; |
| 369 | +} shiva_module_delayed_reloc_t; |
| 370 | + |
341 | 371 | struct shiva_module { |
342 | 372 | int fd; |
343 | 373 | uint64_t flags; |
@@ -369,12 +399,14 @@ struct shiva_module { |
369 | 399 | TAILQ_HEAD(, shiva_module_section_mapping) section_maplist; |
370 | 400 | TAILQ_HEAD(, shiva_module_plt_entry) plt_list; |
371 | 401 | TAILQ_HEAD(, shiva_transform) transform_list; |
| 402 | + TAILQ_HEAD(, shiva_module_delayed_reloc) delayed_reloc_list; |
372 | 403 | } tailq; |
373 | 404 | struct { |
374 | 405 | struct hsearch_data bss; |
375 | 406 | struct hsearch_data got; |
376 | 407 | } cache; |
377 | 408 | shiva_linking_mode_t mode; |
| 409 | + struct shiva_ctx *ctx; /* this is a pointer back to the main context */ |
378 | 410 | }; |
379 | 411 |
|
380 | 412 | typedef struct shiva_trace_regset_x86_64 { |
@@ -535,6 +567,9 @@ bool shiva_maps_validate_addr(shiva_ctx_t *, uint64_t); |
535 | 567 | void shiva_maps_iterator_init(shiva_ctx_t *, shiva_maps_iterator_t *); |
536 | 568 | shiva_iterator_res_t shiva_maps_iterator_next(shiva_maps_iterator_t *, struct shiva_mmap_entry *); |
537 | 569 | bool shiva_maps_get_base(shiva_ctx_t *, uint64_t *); |
| 570 | +bool shiva_maps_get_so_base(struct shiva_ctx *, char *, |
| 571 | + uint64_t *); |
| 572 | + |
538 | 573 | /* |
539 | 574 | * shiva_callsite.c |
540 | 575 | */ |
@@ -772,4 +807,15 @@ shiva_iterator_res_t shiva_xref_iterator_next(struct shiva_xref_iterator *, stru |
772 | 807 | */ |
773 | 808 | bool shiva_tf_process_transforms(struct shiva_module *, uint8_t *, |
774 | 809 | struct elf_section section, uint64_t *segment_offset); |
| 810 | + |
| 811 | +/* |
| 812 | + * shiva_so.c |
| 813 | + */ |
| 814 | +bool shiva_so_resolve_symbol(struct shiva_module *, char *, struct elf_symbol *, |
| 815 | + char **); |
| 816 | + |
| 817 | +/* |
| 818 | + * shiva_post_linker.c |
| 819 | + */ |
| 820 | +void shiva_post_linker(void); |
775 | 821 | #endif |
0 commit comments