17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 55aefb655Srie * Common Development and Distribution License (the "License"). 65aefb655Srie * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 215aefb655Srie 227c478bd9Sstevel@tonic-gate /* 23*ba2be530Sab196087 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 277c478bd9Sstevel@tonic-gate 28a194faf8Srie #include <stdio.h> 297c478bd9Sstevel@tonic-gate #include "_debug.h" 307c478bd9Sstevel@tonic-gate #include "msg.h" 317c478bd9Sstevel@tonic-gate #include "libld.h" 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate static int 355aefb655Srie Dbg_got_compare(Gottable *gtp1, Gottable *gtp2) 367c478bd9Sstevel@tonic-gate { 377c478bd9Sstevel@tonic-gate Gotndx *gnp1 = >p1->gt_gndx; 387c478bd9Sstevel@tonic-gate Gotndx *gnp2 = >p2->gt_gndx; 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate if (gnp1->gn_gotndx > gnp2->gn_gotndx) 417c478bd9Sstevel@tonic-gate return (1); 427c478bd9Sstevel@tonic-gate if (gnp1->gn_gotndx < gnp2->gn_gotndx) 437c478bd9Sstevel@tonic-gate return (-1); 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate return (0); 467c478bd9Sstevel@tonic-gate } 477c478bd9Sstevel@tonic-gate 487c478bd9Sstevel@tonic-gate void 49*ba2be530Sab196087 Dbg_got_display(Ofl_desc *ofl, Off goff, int stage, 50*ba2be530Sab196087 Word m_got_xnumber, size_t m_got_entsize) 517c478bd9Sstevel@tonic-gate { 525aefb655Srie Lm_list *lml = ofl->ofl_lml; 53d326b23bSrie Gottable *gtp = ofl->ofl_gottable; 547c478bd9Sstevel@tonic-gate Word gotndx; 55d326b23bSrie Xword *gptr; 567c478bd9Sstevel@tonic-gate 575aefb655Srie if (DBG_NOTCLASS(DBG_C_GOT)) 587c478bd9Sstevel@tonic-gate return; 597c478bd9Sstevel@tonic-gate 60*ba2be530Sab196087 if (ofl->ofl_gotcnt == m_got_xnumber) 617c478bd9Sstevel@tonic-gate return; 627c478bd9Sstevel@tonic-gate 635aefb655Srie Dbg_util_nl(lml, DBG_NL_STD); 645aefb655Srie dbg_print(lml, MSG_INTL(MSG_GOT_INFO), EC_WORD(ofl->ofl_gotcnt)); 657c478bd9Sstevel@tonic-gate 667c478bd9Sstevel@tonic-gate if (DBG_NOTDETAIL()) 677c478bd9Sstevel@tonic-gate return; 687c478bd9Sstevel@tonic-gate 697c478bd9Sstevel@tonic-gate qsort((char *)gtp, ofl->ofl_gotcnt, sizeof (Gottable), 705aefb655Srie (int(*)(const void *, const void *))Dbg_got_compare); 717c478bd9Sstevel@tonic-gate 72d326b23bSrie if (stage == 0) 73d326b23bSrie dbg_print(lml, MSG_INTL(MSG_GOT_COLUMNS1)); 74d326b23bSrie else 75d326b23bSrie dbg_print(lml, MSG_INTL(MSG_GOT_COLUMNS2)); 767c478bd9Sstevel@tonic-gate 77d326b23bSrie gptr = (Xword *)ofl->ofl_osgot->os_outdata->d_buf; 78d326b23bSrie 79d326b23bSrie for (gotndx = 0; gotndx < ofl->ofl_gotcnt; gotndx++, gtp++, gptr++) { 80d326b23bSrie Sym_desc *sdp = gtp->gt_sym; 817c478bd9Sstevel@tonic-gate const char *refstr, *name; 827c478bd9Sstevel@tonic-gate Gotndx *gnp = >p->gt_gndx; 83d326b23bSrie Lword gotaddval; 84*ba2be530Sab196087 Off off = goff + (gotndx * m_got_entsize); 85d326b23bSrie char index[INDEX_STR_SIZE]; 867c478bd9Sstevel@tonic-gate 87d326b23bSrie (void) snprintf(index, INDEX_STR_SIZE, MSG_ORIG(MSG_GOT_INDEX), 88d326b23bSrie EC_SWORD(gnp->gn_gotndx)); 897c478bd9Sstevel@tonic-gate 90d326b23bSrie if (sdp == 0) 91d326b23bSrie refstr = MSG_ORIG(MSG_STR_EMPTY); 92d326b23bSrie else if (sdp->sd_flags & FLG_SY_SMGOT) 937c478bd9Sstevel@tonic-gate refstr = MSG_ORIG(MSG_GOT_SMALL_PIC); 947c478bd9Sstevel@tonic-gate else 955aefb655Srie refstr = MSG_ORIG(MSG_GOT_BIG_PIC); 967c478bd9Sstevel@tonic-gate 97d326b23bSrie if (sdp == 0) 98d326b23bSrie name = MSG_ORIG(MSG_STR_EMPTY); 99d326b23bSrie else if (sdp->sd_name) 1005aefb655Srie name = Dbg_demangle_name(sdp->sd_name); 1017c478bd9Sstevel@tonic-gate else 1027c478bd9Sstevel@tonic-gate name = MSG_INTL(MSG_STR_UNKNOWN); 1037c478bd9Sstevel@tonic-gate 104d326b23bSrie if (stage == 0) 105d326b23bSrie gotaddval = gnp->gn_addend; 106d326b23bSrie else 107d326b23bSrie gotaddval = *gptr; 108d326b23bSrie 109d326b23bSrie if ((sdp == 0) || (sdp->sd_sym->st_shndx == SHN_UNDEF) || 1107c478bd9Sstevel@tonic-gate (sdp->sd_file == 0)) { 111d326b23bSrie dbg_print(lml, MSG_INTL(MSG_GOT_FORMAT1), index, 112d326b23bSrie refstr, EC_OFF(off), EC_XWORD(gotaddval), name); 1137c478bd9Sstevel@tonic-gate } else { 114d326b23bSrie dbg_print(lml, MSG_INTL(MSG_GOT_FORMAT2), index, 115d326b23bSrie refstr, EC_OFF(off), EC_XWORD(gotaddval), 1167c478bd9Sstevel@tonic-gate sdp->sd_file->ifl_name, name); 1177c478bd9Sstevel@tonic-gate } 1187c478bd9Sstevel@tonic-gate } 1197c478bd9Sstevel@tonic-gate } 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate void 1225aefb655Srie Elf_got_title(Lm_list *lml) 1237c478bd9Sstevel@tonic-gate { 1245aefb655Srie dbg_print(lml, MSG_INTL(MSG_GOT_TITLE)); 1257c478bd9Sstevel@tonic-gate } 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate void 1285aefb655Srie Elf_got_entry(Lm_list *lml, Sword ndx, Addr addr, Xword value, Half mach, 129*ba2be530Sab196087 uchar_t ei_target_data, uchar_t ei_host_data, Word type, void *reloc, 130*ba2be530Sab196087 const char *name) 1317c478bd9Sstevel@tonic-gate { 1325aefb655Srie Rela *rela; 1335aefb655Srie Rel *rel; 1345aefb655Srie const char *str; 135de777a60Sab196087 Conv_inv_buf_t inv_buf; 1365aefb655Srie char index[INDEX_STR_SIZE]; 1377c478bd9Sstevel@tonic-gate 1385aefb655Srie (void) snprintf(index, INDEX_STR_SIZE, MSG_ORIG(MSG_GOT_INDEX), 1395aefb655Srie EC_SWORD(ndx)); 1405aefb655Srie 141*ba2be530Sab196087 /* 142*ba2be530Sab196087 * Got sections are SHT_PROGBITS, and are therefore not xlated by 143*ba2be530Sab196087 * libelf. If the target system has a different byte order than 144*ba2be530Sab196087 * the system displaying the data, swap the bytes so they are 145*ba2be530Sab196087 * presented properly. 146*ba2be530Sab196087 */ 147*ba2be530Sab196087 if (ei_target_data != ei_host_data) 148*ba2be530Sab196087 value = BSWAP_XWORD(value); 149*ba2be530Sab196087 1505aefb655Srie if (reloc) { 1515aefb655Srie if (type == SHT_RELA) { 1525aefb655Srie rela = (Rela *)reloc; 153*ba2be530Sab196087 str = conv_reloc_type(mach, 154*ba2be530Sab196087 ELF_R_TYPE(rela->r_info, mach), 0, &inv_buf); 1557c478bd9Sstevel@tonic-gate } else { 1565aefb655Srie rel = (Rel *)reloc; 157*ba2be530Sab196087 str = conv_reloc_type(mach, 158*ba2be530Sab196087 ELF_R_TYPE(rel->r_info, mach), 0, &inv_buf); 1597c478bd9Sstevel@tonic-gate } 1607c478bd9Sstevel@tonic-gate 1615aefb655Srie if (name) 1625aefb655Srie name = Elf_demangle_name(name); 1637c478bd9Sstevel@tonic-gate else 1645aefb655Srie name = MSG_ORIG(MSG_STR_EMPTY); 1657c478bd9Sstevel@tonic-gate 1665aefb655Srie dbg_print(lml, MSG_INTL(MSG_GOT_ENTRY_RE), index, EC_ADDR(addr), 1675aefb655Srie EC_XWORD(value), str, name); 1685aefb655Srie } else 1695aefb655Srie dbg_print(lml, MSG_INTL(MSG_GOT_ENTRY_NR), index, EC_ADDR(addr), 1705aefb655Srie EC_XWORD(value)); 1717c478bd9Sstevel@tonic-gate } 172