summaryrefslogtreecommitdiffstats
path: root/libebl/ia64_symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'libebl/ia64_symbol.c')
-rw-r--r--libebl/ia64_symbol.c175
1 files changed, 50 insertions, 125 deletions
diff --git a/libebl/ia64_symbol.c b/libebl/ia64_symbol.c
index 2975285b..1b500873 100644
--- a/libebl/ia64_symbol.c
+++ b/libebl/ia64_symbol.c
@@ -18,128 +18,10 @@
#include <elf.h>
#include <stddef.h>
+#include <assert.h>
-#include <libebl_ia64.h>
-
-
-/* Return of the backend. */
-const char *
-ia64_backend_name (void)
-{
- return "ia64";
-}
-
-
-/* Relocation mapping table. */
-static const char *reloc_map_table[] =
- {
- [R_IA64_NONE] = "R_IA64_NONE",
- [R_IA64_IMM14] = "R_IA64_IMM14",
- [R_IA64_IMM22] = "R_IA64_IMM22",
- [R_IA64_IMM64] = "R_IA64_IMM64",
- [R_IA64_DIR32MSB] = "R_IA64_DIR32MSB",
- [R_IA64_DIR32LSB] = "R_IA64_DIR32LSB",
- [R_IA64_DIR64MSB] = "R_IA64_DIR64MSB",
- [R_IA64_DIR64LSB] = "R_IA64_DIR64LSB",
- [R_IA64_GPREL22] = "R_IA64_GPREL22",
- [R_IA64_GPREL64I] = "R_IA64_GPREL64I",
- [R_IA64_GPREL32MSB] = "R_IA64_GPREL32MSB",
- [R_IA64_GPREL32LSB] = "R_IA64_GPREL32LSB",
- [R_IA64_GPREL64MSB] = "R_IA64_GPREL64MSB",
- [R_IA64_GPREL64LSB] = "R_IA64_GPREL64LSB",
- [R_IA64_LTOFF22] = "R_IA64_LTOFF22",
- [R_IA64_LTOFF64I] = "R_IA64_LTOFF64I",
- [R_IA64_PLTOFF22] = "R_IA64_PLTOFF22",
- [R_IA64_PLTOFF64I] = "R_IA64_PLTOFF64I",
- [R_IA64_PLTOFF64MSB] = "R_IA64_PLTOFF64MSB",
- [R_IA64_PLTOFF64LSB] = "R_IA64_PLTOFF64LSB",
- [R_IA64_FPTR64I] = "R_IA64_FPTR64I",
- [R_IA64_FPTR32MSB] = "R_IA64_FPTR32MSB",
- [R_IA64_FPTR32LSB] = "R_IA64_FPTR32LSB",
- [R_IA64_FPTR64MSB] = "R_IA64_FPTR64MSB",
- [R_IA64_FPTR64LSB] = "R_IA64_FPTR64LSB",
- [R_IA64_PCREL60B] = "R_IA64_PCREL60B",
- [R_IA64_PCREL21B] = "R_IA64_PCREL21B",
- [R_IA64_PCREL21M] = "R_IA64_PCREL21M",
- [R_IA64_PCREL21F] = "R_IA64_PCREL21F",
- [R_IA64_PCREL32MSB] = "R_IA64_PCREL32MSB",
- [R_IA64_PCREL32LSB] = "R_IA64_PCREL32LSB",
- [R_IA64_PCREL64MSB] = "R_IA64_PCREL64MSB",
- [R_IA64_PCREL64LSB] = "R_IA64_PCREL64LSB",
- [R_IA64_LTOFF_FPTR22] = "R_IA64_LTOFF_FPTR22",
- [R_IA64_LTOFF_FPTR64I] = "R_IA64_LTOFF_FPTR64I",
- [R_IA64_LTOFF_FPTR32MSB] = "R_IA64_LTOFF_FPTR32MSB",
- [R_IA64_LTOFF_FPTR32LSB] = "R_IA64_LTOFF_FPTR32LSB",
- [R_IA64_LTOFF_FPTR64MSB] = "R_IA64_LTOFF_FPTR64MSB",
- [R_IA64_LTOFF_FPTR64LSB] = "R_IA64_LTOFF_FPTR64LSB",
- [R_IA64_SEGREL32MSB] = "R_IA64_SEGREL32MSB",
- [R_IA64_SEGREL32LSB] = "R_IA64_SEGREL32LSB",
- [R_IA64_SEGREL64MSB] = "R_IA64_SEGREL64MSB",
- [R_IA64_SEGREL64LSB] = "R_IA64_SEGREL64LSB",
- [R_IA64_SECREL32MSB] = "R_IA64_SECREL32MSB",
- [R_IA64_SECREL32LSB] = "R_IA64_SECREL32LSB",
- [R_IA64_SECREL64MSB] = "R_IA64_SECREL64MSB",
- [R_IA64_SECREL64LSB] = "R_IA64_SECREL64LSB",
- [R_IA64_REL32MSB] = "R_IA64_REL32MSB",
- [R_IA64_REL32LSB] = "R_IA64_REL32LSB",
- [R_IA64_REL64MSB] = "R_IA64_REL64MSB",
- [R_IA64_REL64LSB] = "R_IA64_REL64LSB",
- [R_IA64_LTV32MSB] = "R_IA64_LTV32MSB",
- [R_IA64_LTV32LSB] = "R_IA64_LTV32LSB",
- [R_IA64_LTV64MSB] = "R_IA64_LTV64MSB",
- [R_IA64_LTV64LSB] = "R_IA64_LTV64LSB",
- [R_IA64_PCREL21BI] = "R_IA64_PCREL21BI",
- [R_IA64_PCREL22] = "R_IA64_PCREL22",
- [R_IA64_PCREL64I] = "R_IA64_PCREL64I",
- [R_IA64_IPLTMSB] = "R_IA64_IPLTMSB",
- [R_IA64_IPLTLSB] = "R_IA64_IPLTLSB",
- [R_IA64_COPY] = "R_IA64_COPY",
- [R_IA64_SUB] = "R_IA64_SUB",
- [R_IA64_LTOFF22X] = "R_IA64_LTOFF22X",
- [R_IA64_LDXMOV] = "R_IA64_LDXMOV",
- [R_IA64_TPREL14] = "R_IA64_TPREL14",
- [R_IA64_TPREL22] = "R_IA64_TPREL22",
- [R_IA64_TPREL64I] = "R_IA64_TPREL64I",
- [R_IA64_TPREL64MSB] = "R_IA64_TPREL64MSB",
- [R_IA64_TPREL64LSB] = "R_IA64_TPREL64LSB",
- [R_IA64_LTOFF_TPREL22] = "R_IA64_LTOFF_TPREL22",
- [R_IA64_DTPMOD64MSB] = "R_IA64_DTPMOD64MSB",
- [R_IA64_DTPMOD64LSB] = "R_IA64_DTPMOD64LSB",
- [R_IA64_LTOFF_DTPMOD22] = "R_IA64_LTOFF_DTPMOD22",
- [R_IA64_DTPREL14] = "R_IA64_DTPREL14",
- [R_IA64_DTPREL22] = "R_IA64_DTPREL22",
- [R_IA64_DTPREL64I] = "R_IA64_DTPREL64I",
- [R_IA64_DTPREL32MSB] = "R_IA64_DTPREL32MSB",
- [R_IA64_DTPREL32LSB] = "R_IA64_DTPREL32LSB",
- [R_IA64_DTPREL64MSB] = "R_IA64_DTPREL64MSB",
- [R_IA64_DTPREL64LSB] = "R_IA64_DTPREL64LSB",
- [R_IA64_LTOFF_DTPREL22] = "R_IA64_LTOFF_DTPREL22"
- };
-
-
-/* Determine relocation type string for IA-64. */
-const char *
-ia64_reloc_type_name (int type, char *buf __attribute__ ((unused)),
- size_t len __attribute__ ((unused)))
-{
- if (type < 0
- || ((size_t) type
- >= sizeof (reloc_map_table) / sizeof (reloc_map_table[0])))
- return NULL;
-
- return reloc_map_table[type];
-}
-
-
-/* Check for correct relocation type. */
-bool
-ia64_reloc_type_check (int type)
-{
- return (type >= R_IA64_NONE
- && ((size_t) type
- < sizeof (reloc_map_table) / sizeof (reloc_map_table[0]))
- && reloc_map_table[type] != NULL) ? true : false;
-}
+#define BACKEND ia64_
+#include "libebl_CPU.h"
const char *
@@ -164,7 +46,6 @@ ia64_segment_type_name (int segment, char *buf __attribute__ ((unused)),
return NULL;
}
-
const char *
ia64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
size_t len __attribute__ ((unused)))
@@ -179,11 +60,11 @@ ia64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
return NULL;
}
-/* Check whether given relocation is a copy relocation. */
+/* Check dynamic tag. */
bool
-ia64_copy_reloc_p (int reloc)
+ia64_dynamic_tag_check (int64_t tag)
{
- return reloc == R_IA64_COPY;
+ return tag == DT_IA_64_PLT_RESERVE;
}
/* Check whether machine flags are valid. */
@@ -192,3 +73,47 @@ ia64_machine_flag_check (GElf_Word flags)
{
return ((flags &~ EF_IA_64_ABI64) == 0);
}
+
+/* Return symbolic representation of section type. */
+const char *
+ia64_section_type_name (int type,
+ char *buf __attribute__ ((unused)),
+ size_t len __attribute__ ((unused)))
+{
+ switch (type)
+ {
+ case SHT_IA_64_EXT:
+ return "SHT_IA_64_EXT";
+ case SHT_IA_64_UNWIND:
+ return "HT_IA_64_UNWIND";
+ }
+
+ return NULL;
+}
+
+/* Check for the simple reloc types. */
+Elf_Type
+ia64_reloc_simple_type (Ebl *ebl, int type)
+{
+ switch (type)
+ {
+ case R_IA64_DIR32MSB:
+ if (ebl->data == ELFDATA2MSB)
+ return ELF_T_WORD;
+ break;
+ case R_IA64_DIR32LSB:
+ if (ebl->data == ELFDATA2LSB)
+ return ELF_T_WORD;
+ break;
+ case R_IA64_DIR64MSB:
+ if (ebl->data == ELFDATA2MSB)
+ return ELF_T_XWORD;
+ break;
+ case R_IA64_DIR64LSB:
+ if (ebl->data == ELFDATA2LSB)
+ return ELF_T_XWORD;
+ break;
+ }
+
+ return ELF_T_NUM;
+}