00001 /* 00002 * See the dyninst/COPYRIGHT file for copyright information. 00003 * 00004 * We provide the Paradyn Tools (below described as "Paradyn") 00005 * on an AS IS basis, and do not warrant its validity or performance. 00006 * We reserve the right to update, modify, or discontinue this 00007 * software at any time. We shall have no obligation to supply such 00008 * updates or modifications or any other form of support to you. 00009 * 00010 * By your use of Paradyn, you understand and agree that we (or any 00011 * other person or entity with proprietary rights in Paradyn) are 00012 * under no obligation to provide either maintenance services, 00013 * update services, notices of latent defects, or correction of 00014 * defects for Paradyn. 00015 * 00016 * This library is free software; you can redistribute it and/or 00017 * modify it under the terms of the GNU Lesser General Public 00018 * License as published by the Free Software Foundation; either 00019 * version 2.1 of the License, or (at your option) any later version. 00020 * 00021 * This library is distributed in the hope that it will be useful, 00022 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00023 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00024 * Lesser General Public License for more details. 00025 * 00026 * You should have received a copy of the GNU Lesser General Public 00027 * License along with this library; if not, write to the Free Software 00028 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00029 */ 00030 00031 /* Functions of the relocationEntry class specific to PPC64 ELF */ 00032 #include <elf.h> 00033 #include "Symtab.h" 00034 #include "Serialization.h" 00035 #include "annotations.h" 00036 00037 const char* relocationEntry::relType2Str(unsigned long r, unsigned /*addressWidth*/) { 00038 switch(r) { 00039 CASE_RETURN_STR(R_PPC64_NONE); 00040 CASE_RETURN_STR(R_PPC64_ADDR32); 00041 CASE_RETURN_STR(R_PPC64_ADDR24); 00042 CASE_RETURN_STR(R_PPC64_ADDR16); 00043 CASE_RETURN_STR(R_PPC64_ADDR16_LO); 00044 CASE_RETURN_STR(R_PPC64_ADDR16_HI); 00045 CASE_RETURN_STR(R_PPC64_ADDR16_HA); 00046 CASE_RETURN_STR(R_PPC64_ADDR14); 00047 CASE_RETURN_STR(R_PPC64_ADDR14_BRTAKEN); 00048 CASE_RETURN_STR(R_PPC64_ADDR14_BRNTAKEN); 00049 CASE_RETURN_STR(R_PPC64_REL24); 00050 CASE_RETURN_STR(R_PPC64_REL14); 00051 CASE_RETURN_STR(R_PPC64_REL14_BRTAKEN); 00052 CASE_RETURN_STR(R_PPC64_REL14_BRNTAKEN); 00053 CASE_RETURN_STR(R_PPC64_GOT16); 00054 CASE_RETURN_STR(R_PPC64_GOT16_LO); 00055 CASE_RETURN_STR(R_PPC64_GOT16_HI); 00056 CASE_RETURN_STR(R_PPC64_GOT16_HA); 00057 CASE_RETURN_STR(R_PPC64_COPY); 00058 CASE_RETURN_STR(R_PPC64_GLOB_DAT); 00059 CASE_RETURN_STR(R_PPC64_JMP_SLOT); 00060 CASE_RETURN_STR(R_PPC64_RELATIVE); 00061 CASE_RETURN_STR(R_PPC64_UADDR32); 00062 CASE_RETURN_STR(R_PPC64_UADDR16); 00063 CASE_RETURN_STR(R_PPC64_REL32); 00064 CASE_RETURN_STR(R_PPC64_PLT32); 00065 CASE_RETURN_STR(R_PPC64_PLTREL32); 00066 CASE_RETURN_STR(R_PPC64_PLT16_LO); 00067 CASE_RETURN_STR(R_PPC64_PLT16_HI); 00068 CASE_RETURN_STR(R_PPC64_PLT16_HA); 00069 CASE_RETURN_STR(R_PPC64_SECTOFF); 00070 CASE_RETURN_STR(R_PPC64_SECTOFF_LO); 00071 CASE_RETURN_STR(R_PPC64_SECTOFF_HI); 00072 CASE_RETURN_STR(R_PPC64_SECTOFF_HA); 00073 CASE_RETURN_STR(R_PPC64_ADDR30); 00074 CASE_RETURN_STR(R_PPC64_ADDR64); 00075 CASE_RETURN_STR(R_PPC64_ADDR16_HIGHER); 00076 CASE_RETURN_STR(R_PPC64_ADDR16_HIGHERA); 00077 CASE_RETURN_STR(R_PPC64_ADDR16_HIGHEST); 00078 CASE_RETURN_STR(R_PPC64_ADDR16_HIGHESTA); 00079 CASE_RETURN_STR(R_PPC64_UADDR64); 00080 CASE_RETURN_STR(R_PPC64_REL64); 00081 CASE_RETURN_STR(R_PPC64_PLT64); 00082 CASE_RETURN_STR(R_PPC64_PLTREL64); 00083 CASE_RETURN_STR(R_PPC64_TOC16); 00084 CASE_RETURN_STR(R_PPC64_TOC16_LO); 00085 CASE_RETURN_STR(R_PPC64_TOC16_HI); 00086 CASE_RETURN_STR(R_PPC64_TOC16_HA); 00087 CASE_RETURN_STR(R_PPC64_TOC); 00088 CASE_RETURN_STR(R_PPC64_PLTGOT16); 00089 CASE_RETURN_STR(R_PPC64_PLTGOT16_LO); 00090 CASE_RETURN_STR(R_PPC64_PLTGOT16_HI); 00091 CASE_RETURN_STR(R_PPC64_PLTGOT16_HA); 00092 CASE_RETURN_STR(R_PPC64_ADDR16_DS); 00093 CASE_RETURN_STR(R_PPC64_ADDR16_LO_DS); 00094 CASE_RETURN_STR(R_PPC64_GOT16_DS); 00095 CASE_RETURN_STR(R_PPC64_GOT16_LO_DS); 00096 CASE_RETURN_STR(R_PPC64_PLT16_LO_DS); 00097 CASE_RETURN_STR(R_PPC64_SECTOFF_DS); 00098 CASE_RETURN_STR(R_PPC64_SECTOFF_LO_DS); 00099 CASE_RETURN_STR(R_PPC64_TOC16_DS); 00100 CASE_RETURN_STR(R_PPC64_TOC16_LO_DS); 00101 CASE_RETURN_STR(R_PPC64_PLTGOT16_DS); 00102 CASE_RETURN_STR(R_PPC64_PLTGOT16_LO_DS); 00103 CASE_RETURN_STR(R_PPC64_TLS); 00104 CASE_RETURN_STR(R_PPC64_DTPMOD64); 00105 CASE_RETURN_STR(R_PPC64_TPREL16); 00106 CASE_RETURN_STR(R_PPC64_TPREL16_LO); 00107 CASE_RETURN_STR(R_PPC64_TPREL16_HI); 00108 CASE_RETURN_STR(R_PPC64_TPREL16_HA); 00109 CASE_RETURN_STR(R_PPC64_TPREL64); 00110 CASE_RETURN_STR(R_PPC64_DTPREL16); 00111 CASE_RETURN_STR(R_PPC64_DTPREL16_LO); 00112 CASE_RETURN_STR(R_PPC64_DTPREL16_HI); 00113 CASE_RETURN_STR(R_PPC64_DTPREL16_HA); 00114 CASE_RETURN_STR(R_PPC64_DTPREL64); 00115 CASE_RETURN_STR(R_PPC64_GOT_TLSGD16); 00116 CASE_RETURN_STR(R_PPC64_GOT_TLSGD16_LO); 00117 CASE_RETURN_STR(R_PPC64_GOT_TLSGD16_HI); 00118 CASE_RETURN_STR(R_PPC64_GOT_TLSGD16_HA); 00119 CASE_RETURN_STR(R_PPC64_GOT_TLSLD16); 00120 CASE_RETURN_STR(R_PPC64_GOT_TLSLD16_LO); 00121 CASE_RETURN_STR(R_PPC64_GOT_TLSLD16_HI); 00122 CASE_RETURN_STR(R_PPC64_GOT_TLSLD16_HA); 00123 CASE_RETURN_STR(R_PPC64_GOT_TPREL16_DS); 00124 CASE_RETURN_STR(R_PPC64_GOT_TPREL16_LO_DS); 00125 CASE_RETURN_STR(R_PPC64_GOT_TPREL16_HI); 00126 CASE_RETURN_STR(R_PPC64_GOT_TPREL16_HA); 00127 CASE_RETURN_STR(R_PPC64_GOT_DTPREL16_DS); 00128 CASE_RETURN_STR(R_PPC64_GOT_DTPREL16_LO_DS); 00129 CASE_RETURN_STR(R_PPC64_GOT_DTPREL16_HI); 00130 CASE_RETURN_STR(R_PPC64_GOT_DTPREL16_HA); 00131 CASE_RETURN_STR(R_PPC64_TPREL16_DS); 00132 CASE_RETURN_STR(R_PPC64_TPREL16_LO_DS); 00133 CASE_RETURN_STR(R_PPC64_TPREL16_HIGHER); 00134 CASE_RETURN_STR(R_PPC64_TPREL16_HIGHERA); 00135 CASE_RETURN_STR(R_PPC64_TPREL16_HIGHEST); 00136 CASE_RETURN_STR(R_PPC64_TPREL16_HIGHESTA); 00137 CASE_RETURN_STR(R_PPC64_DTPREL16_DS); 00138 CASE_RETURN_STR(R_PPC64_DTPREL16_LO_DS); 00139 CASE_RETURN_STR(R_PPC64_DTPREL16_HIGHER); 00140 CASE_RETURN_STR(R_PPC64_DTPREL16_HIGHERA); 00141 CASE_RETURN_STR(R_PPC64_DTPREL16_HIGHEST); 00142 CASE_RETURN_STR(R_PPC64_DTPREL16_HIGHESTA); 00143 #if defined(R_PPC64_NUM) 00144 CASE_RETURN_STR(R_PPC64_NUM); 00145 #endif 00146 default: 00147 return "?"; 00148 } 00149 } 00150 00151 SYMTAB_EXPORT unsigned long relocationEntry::getGlobalRelType(unsigned addressWidth, Symbol *sym) { 00152 if (addressWidth == 4) 00153 return R_PPC_GLOB_DAT; 00154 00155 if (!sym) return R_PPC64_GLOB_DAT; 00156 if (sym->getType() == Symbol::ST_FUNCTION) 00157 return R_PPC64_JMP_SLOT; 00158 else 00159 return R_PPC64_GLOB_DAT; 00160 }
1.6.1