blob: e3fe0cee7494db72ddfe61a2087b1484d6e6e2e3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include "x86_backend.h"
#include <stdlib.h>
deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest)
{
deferred_addr * new_head = malloc(sizeof(deferred_addr));
new_head->next = old_head;
new_head->address = address & 0xFFFFFF;
new_head->dest = dest;
return new_head;
}
void remove_deferred_until(deferred_addr **head_ptr, deferred_addr * remove_to)
{
for(deferred_addr *cur = *head_ptr; cur && cur != remove_to; cur = *head_ptr)
{
*head_ptr = cur->next;
free(cur);
}
}
void process_deferred(deferred_addr ** head_ptr, void * context, native_addr_func get_native)
{
deferred_addr * cur = *head_ptr;
deferred_addr **last_next = head_ptr;
while(cur)
{
uint8_t * native = get_native(context, cur->address);//get_native_address(opts->native_code_map, cur->address);
if (native) {
int32_t disp = native - (cur->dest + 4);
uint8_t * out = cur->dest;
*(out++) = disp;
disp >>= 8;
*(out++) = disp;
disp >>= 8;
*(out++) = disp;
disp >>= 8;
*out = disp;
*last_next = cur->next;
free(cur);
cur = *last_next;
} else {
last_next = &(cur->next);
cur = cur->next;
}
}
}
|