diff options
Diffstat (limited to 'agent/tcf/machine/i386/elf-mdep.h')
-rw-r--r-- | agent/tcf/machine/i386/elf-mdep.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/agent/tcf/machine/i386/elf-mdep.h b/agent/tcf/machine/i386/elf-mdep.h new file mode 100644 index 00000000..3ab791c7 --- /dev/null +++ b/agent/tcf/machine/i386/elf-mdep.h @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * and the Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * You may elect to redistribute this code under either of these licenses. + * + * Contributors: + * Wind River Systems - initial API and implementation + *******************************************************************************/ + +/* + * This module provides CPU specific ELF definitions for X86. + */ + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 + +static void elf_relocate(void) { + if (relocs->type == SHT_REL) { + U4_T x = *(U4_T *)((char *)section->data + reloc_offset); + if (section->file->type != ET_REL) str_exception(ERR_INV_FORMAT, "Invalid relocation record"); + if (section->file->byte_swap) SWAP(x); + assert(reloc_addend == 0); + reloc_addend = x; + } + switch (reloc_type) { + case R_386_NONE: + *destination_section = NULL; + break; + case R_386_32: + if (data_size < 4) str_exception(ERR_INV_FORMAT, "Invalid relocation record"); + *(U4_T *)data_buf = (U4_T)(sym_value + reloc_addend); + if (section->file->byte_swap) SWAP(*(U4_T *)data_buf); + break; + case R_386_PC32: + if (data_size < 4) str_exception(ERR_INV_FORMAT, "Invalid relocation record"); + *(U4_T *)data_buf = (U4_T)(section->addr + reloc_offset + sym_value + reloc_addend); + if (section->file->byte_swap) SWAP(*(U4_T *)data_buf); + break; + default: + str_exception(ERR_INV_FORMAT, "Unsupported relocation type"); + } +} |