00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include <stdlib.h>
00043 #include <stdio.h>
00044 #include <elf.h>
00045 #include <sys/unwindP.h>
00046
00047 #define USE_STANDARD_TYPES 1
00048 #include "defs.h"
00049 #include <elf.h>
00050 #include "elf_stuff.h"
00051 #include "em_elf.h"
00052
00053
00054
00055
00056
00057 __unw_error_t unwind_dump2elf(char *unwind_table_ptr,
00058 __uint64_t unwind_table_size,
00059 char *unwind_info_ptr,
00060 __uint64_t unwind_info_size,
00061 void *arg) {
00062 __uint64_t i, unwind_table_size_in_entries =
00063 unwind_table_size/sizeof(__unw_table_entry_t);
00064 __unw_table_entry_t *unwind_table =
00065 (__unw_table_entry_t *)unwind_table_ptr;
00066 pSCNINFO scninfo_table, scninfo_info, scninfo_text = (pSCNINFO)arg;
00067 Elf64_Word symindex_table, symindex_info, symindex_text;
00068 __unw_addr_t zero_offset = 0L;
00069
00070
00071 if ((NULL == unwind_table_ptr) || (NULL == unwind_info_ptr)) {
00072 return __UNW_INV_ARG_ERROR;
00073 }
00074
00075
00076 scninfo_table = Em_New_Section(IA64_UNWIND, SHT_IA64_UNWIND,
00077 SHF_ALLOC | SHF_IRIX_NOSTRIP,
00078 (Elf64_Xword)sizeof(__unw_table_entry_t),
00079 ELF64_FSZ_WORD);
00080 scninfo_info = Em_New_Section(IA64_UNWIND_INFO, SHT_IA64_UNWIND_INFO,
00081 SHF_ALLOC | SHF_IRIX_NOSTRIP,
00082 (Elf64_Xword)sizeof(__unw_dbl_word_t),
00083 ELF64_FSZ_XWORD);
00084
00085
00086 symindex_table = Em_Create_Section_Symbol(scninfo_table);
00087 symindex_info = Em_Create_Section_Symbol(scninfo_info);
00088 symindex_text = Em_Create_Section_Symbol(scninfo_text);
00089
00090
00091 Em_New_Data_Buffer(scninfo_info, (Elf64_Xword)unwind_table_size,
00092 ELF64_FSZ_WORD);
00093 Em_New_Data_Buffer(scninfo_table, (Elf64_Xword)unwind_info_size,
00094 ELF64_FSZ_XWORD);
00095
00096
00097 for (i = 0; i < unwind_table_size_in_entries; i++) {
00098 Em_Add_Bytes_To_Scn(scninfo_table, (void *)&zero_offset,
00099 (Elf64_Xword)sizeof(__unw_addr_t), ELF64_FSZ_WORD);
00100 Em_Add_New_Rela(symindex_text, (unsigned char)R_IA64_SEGREL64MSB,
00101 (Elf64_Addr)(i*sizeof(__unw_table_entry_t)),
00102 (Elf64_Sxword)unwind_table[i]._start,
00103 scninfo_table);
00104 Em_Add_Bytes_To_Scn(scninfo_table, (void *)&zero_offset,
00105 (Elf64_Xword)sizeof(__unw_addr_t), ELF64_FSZ_WORD);
00106 Em_Add_New_Rela(symindex_text, (unsigned char)R_IA64_SEGREL64MSB,
00107 (Elf64_Addr)(i*sizeof(__unw_table_entry_t) +
00108 1*sizeof(__unw_addr_t)),
00109 (Elf64_Sxword)unwind_table[i]._end,
00110 scninfo_table);
00111 Em_Add_Bytes_To_Scn(scninfo_table, (void *)&zero_offset,
00112 (Elf64_Xword)sizeof(__unw_addr_t), ELF64_FSZ_WORD);
00113 Em_Add_New_Rela(symindex_info, (unsigned char)R_IA64_SEGREL64MSB,
00114 (Elf64_Addr)(i*sizeof(__unw_table_entry_t) +
00115 2*sizeof(__unw_addr_t)),
00116 (Elf64_Sxword)unwind_table[i]._info,
00117 scninfo_table);
00118 }
00119
00120
00121 Em_Add_Bytes_To_Scn(scninfo_info, (void *)unwind_info_ptr,
00122 (Elf64_Xword)unwind_info_size, ELF64_FSZ_XWORD);
00123
00124
00125 Em_End_Section(scninfo_table);
00126 Em_End_Section(scninfo_info);
00127
00128 return __UNW_OK;
00129 }