#include <stdio.h>
#include <string.h>
#include "mach-o/loader.h"
#include "stuff/bytesex.h"
#include "ofile_print.h"
#include "coff/base_relocs.h"
#include "coff/bytesex.h"
void
print_coff_reloc_section(
struct load_command *load_commands,
uint32_t ncmds,
uint32_t sizeofcmds,
uint32_t filetype,
enum byte_sex object_byte_sex,
char *object_addr,
uint32_t object_size,
enum bool verbose)
{
char *sect, *p;
uint64_t sect_addr, sect_size, size;
int64_t left;
struct relocation_info *sect_relocs;
uint32_t sect_nrelocs, sect_flags, block_size;
enum byte_sex host_byte_sex;
enum bool swapped;
struct base_relocation_block_header h;
struct base_relocation_entry b;
printf("Contents of (__RELOC,__reloc) section\n");
if(get_sect_info("__RELOC", "__reloc", load_commands,
ncmds, sizeofcmds, filetype, object_byte_sex,
object_addr, object_size, §, §_size, §_addr,
§_relocs, §_nrelocs, §_flags) == TRUE){
host_byte_sex = get_host_byte_sex();
swapped = host_byte_sex != object_byte_sex;
p = sect;
left = sect_size;
while(left > 0){
memset(&h, '\0', sizeof(struct base_relocation_block_header));
size = left < sizeof(struct base_relocation_block_header) ?
left : sizeof(struct base_relocation_block_header);
memcpy(&h, p, size);
if(swapped)
swap_base_relocation_block_header(&h, host_byte_sex);
printf("Page RVA 0x%08x\n", h.page_rva);
printf("Block Size 0x%08x\n", h.block_size);
p += sizeof(struct base_relocation_block_header);
left -= sizeof(struct base_relocation_block_header);
block_size = sizeof(struct base_relocation_block_header);
while(block_size < h.block_size && left > 0){
memset(&b, '\0', sizeof(struct base_relocation_entry));
size = left < sizeof(struct base_relocation_entry) ?
left : sizeof(struct base_relocation_entry);
memcpy(&b, p, size);
if(swapped)
swap_base_relocation_entry(&b, 1, host_byte_sex);
switch(b.type){
case IMAGE_REL_BASED_ABSOLUTE:
printf(" Type IMAGE_REL_BASED_ABSOLUTE\n");
break;
case IMAGE_REL_BASED_HIGHLOW:
printf(" Type IMAGE_REL_BASED_HIGHLOW\n");
break;
case IMAGE_REL_BASED_DIR64:
printf(" Type IMAGE_REL_BASED_DIR64\n");
break;
default:
printf(" Type %u\n", b.type);
break;
}
printf(" Offset 0x%0x\n", b.offset);
p += sizeof(struct base_relocation_entry);
left -= sizeof(struct base_relocation_entry);
block_size += sizeof(struct base_relocation_entry);
}
}
}
}