1e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata/*
2e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This file is part of ltrace.
39e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata * Copyright (C) 2013 Petr Machata, Red Hat Inc.
4e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2010 Zach Welch, CodeSourcery
5e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Copyright (C) 2004,2008,2009 Juan Cespedes
6e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
7e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is free software; you can redistribute it and/or
8e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * modify it under the terms of the GNU General Public License as
9e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * published by the Free Software Foundation; either version 2 of the
10e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * License, or (at your option) any later version.
11e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
12e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * This program is distributed in the hope that it will be useful, but
13e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
14e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * General Public License for more details.
16e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata *
17e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * You should have received a copy of the GNU General Public License
18e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * along with this program; if not, write to the Free Software
19e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata * 02110-1301 USA
21e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata */
22e99af270a60891e68d465c4cd97dbe29cd1a05e4Petr Machata
23d914a206a11cc1011a45f00674b1e16988fae77fJuan Cespedes#include <gelf.h>
241383e5bd876baa123b39210c2210d256bcfa5becPetr Machata#include <stdio.h>
251383e5bd876baa123b39210c2210d256bcfa5becPetr Machata#include <string.h>
26c0ab28673d03bdf8f264556bde0d3806ea062322Petr Machata
27366c2f46d844f040458df9b7e35fc3b8527ed2d3Petr Machata#include "proc.h"
28c0ab28673d03bdf8f264556bde0d3806ea062322Petr Machata#include "library.h"
29c0ab28673d03bdf8f264556bde0d3806ea062322Petr Machata#include "ltrace-elf.h"
30d914a206a11cc1011a45f00674b1e16988fae77fJuan Cespedes
31d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welchstatic int
321383e5bd876baa123b39210c2210d256bcfa5becPetr Machataget_hardfp(uint64_t abi_vfp_args)
331383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
341383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	if (abi_vfp_args == 2)
351383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		fprintf(stderr,
361383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			"Tag_ABI_VFP_args value 2 (tool chain-specific "
371383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			"conventions) not supported.\n");
381383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	return abi_vfp_args == 1;
391383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
401383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
411383e5bd876baa123b39210c2210d256bcfa5becPetr Machataint
421383e5bd876baa123b39210c2210d256bcfa5becPetr Machataarch_elf_init(struct ltelf *lte, struct library *lib)
431383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
449e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	GElf_Addr jmprel_addr;
459e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	Elf_Scn *jmprel_sec;
469e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	GElf_Shdr jmprel_shdr;
479e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	if (elf_load_dynamic_entry(lte, DT_JMPREL, &jmprel_addr) < 0
489e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	    || elf_get_section_covering(lte, jmprel_addr,
499e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata					&jmprel_sec, &jmprel_shdr) < 0
509e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	    || jmprel_sec == NULL)
519e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata		return -1;
529e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata
539e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	lte->arch.jmprel_data = elf_loaddata(jmprel_sec, &jmprel_shdr);
549e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata	if (lte->arch.jmprel_data == NULL)
559e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata		return -1;
569e33f5ac1037adeb32e9d693e6555967e9be68a6Petr Machata
571383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	/* Nothing in this section is strictly critical.  It's not
581383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	 * that much of a deal if we fail to guess right whether the
591383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	 * ABI is softfp or hardfp.  */
601383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	unsigned hardfp = 0;
611383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
621383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	Elf_Scn *scn;
631383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	Elf_Data *data;
641383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	GElf_Shdr shdr;
651383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	if (elf_get_section_type(lte, SHT_ARM_ATTRIBUTES, &scn, &shdr) < 0
661383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	    || (scn != NULL && (data = elf_loaddata(scn, &shdr)) == NULL)) {
671383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		fprintf(stderr,
681383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			"Error when obtaining ARM attribute section: %s\n",
691383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			elf_errmsg(-1));
701383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		goto done;
711383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
721383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	} else if (scn != NULL && data != NULL) {
731383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		GElf_Xword offset = 0;
741383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		uint8_t version;
751383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		if (elf_read_next_u8(data, &offset, &version) < 0) {
761383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			goto done;
771383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		} else if (version != 'A') {
781383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			fprintf(stderr, "Unsupported ARM attribute section "
791383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				"version %d ('%c').\n", version, version);
801383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			goto done;
811383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		}
821383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
831383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		do {
841383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			const char signature[] = "aeabi";
851383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			/* N.B. LEN is including the length field
861383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			 * itself.  */
871383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			uint32_t sec_len;
881383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			if (elf_read_u32(data, offset, &sec_len) < 0
891383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			    || !elf_can_read_next(data, offset, sec_len)) {
901383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				goto done;
911383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			}
921383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			const GElf_Xword next_offset = offset + sec_len;
931383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			offset += 4;
941383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
951383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			if (sec_len < 4 + sizeof signature
961383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			    || strcmp(signature, data->d_buf + offset) != 0)
971383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				goto skip;
981383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			offset += sizeof signature;
991383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1001383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			const GElf_Xword offset0 = offset;
1011383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			uint64_t tag;
1021383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			uint32_t sub_len;
1031383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			if (elf_read_next_uleb128(data, &offset, &tag) < 0
1041383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			    || elf_read_next_u32(data, &offset, &sub_len) < 0
1051383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			    || !elf_can_read_next(data, offset0, sub_len))
1061383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				goto done;
1071383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1081383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			if (tag != 1)
1091383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				/* IHI0045D_ABI_addenda: "section and
1101383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				 * symbol attributes are deprecated
1111383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				 * [...] consumers are permitted to
1121383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				 * ignore them."  */
1131383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				goto skip;
1141383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1151383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			while (offset < offset0 + sub_len) {
1161383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				if (elf_read_next_uleb128(data,
1171383e5bd876baa123b39210c2210d256bcfa5becPetr Machata							  &offset, &tag) < 0)
1181383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					goto done;
1191383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1201383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				switch (tag) {
1211383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					uint64_t v;
1221383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 6: /* Tag_CPU_arch */
1231383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 7: /* Tag_CPU_arch_profile */
1241383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 8: /* Tag_ARM_ISA_use */
1251383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 9: /* Tag_THUMB_ISA_use */
1261383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 10: /* Tag_FP_arch */
1271383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 11: /* Tag_WMMX_arch */
1281383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 12: /* Tag_Advanced_SIMD_arch */
1291383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 13: /* Tag_PCS_config */
1301383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 14: /* Tag_ABI_PCS_R9_use */
1311383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 15: /* Tag_ABI_PCS_RW_data */
1321383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 16: /* Tag_ABI_PCS_RO_data */
1331383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 17: /* Tag_ABI_PCS_GOT_use */
1341383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 18: /* Tag_ABI_PCS_wchar_t */
1351383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 19: /* Tag_ABI_FP_rounding */
1361383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 20: /* Tag_ABI_FP_denormal */
1371383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 21: /* Tag_ABI_FP_exceptions */
1381383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 22: /* Tag_ABI_FP_user_exceptions */
1391383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 23: /* Tag_ABI_FP_number_model */
1401383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 24: /* Tag_ABI_align_needed */
1411383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 25: /* Tag_ABI_align_preserved */
1421383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 26: /* Tag_ABI_enum_size */
1431383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 27: /* Tag_ABI_HardFP_use */
1441383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 28: /* Tag_ABI_VFP_args */
1451383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 29: /* Tag_ABI_WMMX_args */
1461383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 30: /* Tag_ABI_optimization_goals */
1471383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 31: /* Tag_ABI_FP_optimization_goals */
1481383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 32: /* Tag_compatibility */
1491383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 34: /* Tag_CPU_unaligned_access */
1501383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 36: /* Tag_FP_HP_extension */
1511383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 38: /* Tag_ABI_FP_16bit_format */
1521383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 42: /* Tag_MPextension_use */
1531383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 70: /* Tag_MPextension_use as well */
1541383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 44: /* Tag_DIV_use */
1551383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 64: /* Tag_nodefaults */
1561383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 66: /* Tag_T2EE_use */
1571383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 68: /* Tag_Virtualization_use */
1581383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				uleb128:
1591383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					if (elf_read_next_uleb128
1601383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						(data, &offset, &v) < 0)
1611383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						goto done;
1621383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					if (tag == 28)
1631383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						hardfp = get_hardfp(v);
1641383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					if (tag != 32)
1651383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						continue;
1661383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1671383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					/* Tag 32 has two arguments,
1681383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					 * fall through.  */
1691383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1701383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 4:	/* Tag_CPU_raw_name */
1711383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 5:	/* Tag_CPU_name */
1721383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 65: /* Tag_also_compatible_with */
1731383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				case 67: /* Tag_conformance */
1741383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				ntbs:
1751383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					offset += strlen(data->d_buf
1761383e5bd876baa123b39210c2210d256bcfa5becPetr Machata							 + offset) + 1;
1771383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					continue;
1781383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				}
1791383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1801383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				/* Handle unknown tags in a generic
1811383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				 * manner, if possible.  */
1821383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				if (tag <= 32) {
1831383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					fprintf(stderr,
1841383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						"Unknown tag %lld "
1851383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						"at offset %#llx "
1861383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						"of ARM attribute section.",
1871383e5bd876baa123b39210c2210d256bcfa5becPetr Machata						tag, offset);
1881383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					goto skip;
1891383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				} else if (tag % 2 == 0) {
1901383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					goto uleb128;
1911383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				} else {
1921383e5bd876baa123b39210c2210d256bcfa5becPetr Machata					goto ntbs;
1931383e5bd876baa123b39210c2210d256bcfa5becPetr Machata				}
1941383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			}
1951383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1961383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		skip:
1971383e5bd876baa123b39210c2210d256bcfa5becPetr Machata			offset = next_offset;
1981383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
1991383e5bd876baa123b39210c2210d256bcfa5becPetr Machata		} while (elf_can_read_next(data, offset, 1));
2001383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2011383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	}
2021383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2031383e5bd876baa123b39210c2210d256bcfa5becPetr Machatadone:
2041383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	lib->arch.hardfp = hardfp;
2051383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	return 0;
2061383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
2071383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2081383e5bd876baa123b39210c2210d256bcfa5becPetr Machatavoid
2091383e5bd876baa123b39210c2210d256bcfa5becPetr Machataarch_elf_destroy(struct ltelf *lte)
2101383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
2111383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
2121383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2131383e5bd876baa123b39210c2210d256bcfa5becPetr Machatastatic int
214d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welcharch_plt_entry_has_stub(struct ltelf *lte, size_t off) {
2151383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	char *buf = (char *) lte->arch.jmprel_data->d_buf;
2161383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	uint16_t op = *(uint16_t *) (buf + off);
217d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch	return op == 0x4778;
218d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch}
219d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch
220f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan CespedesGElf_Addr
221f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesarch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela * rela) {
2221383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	size_t start = lte->arch.jmprel_data->d_size + 12;
223d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch	size_t off = start + 20, i;
224d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch	for (i = 0; i < ndx; i++)
225d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch		off += arch_plt_entry_has_stub(lte, off) ? 16 : 12;
226d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch	if (arch_plt_entry_has_stub(lte, off))
227d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch		off += 4;
228d568f51920d5b2e0813cb5bb7e3cca10fc404623Zach Welch	return lte->plt_addr + off - start;
2299a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand}
2309a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
231f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesvoid *
232929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasym2addr(struct process *proc, struct library_symbol *sym)
233929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
23476c61f15d7989bf7adffed2e46a44c34a80bd927Paul Gilliam	return sym->enter_addr;
235d914a206a11cc1011a45f00674b1e16988fae77fJuan Cespedes}
2361383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2371383e5bd876baa123b39210c2210d256bcfa5becPetr Machataint
2381383e5bd876baa123b39210c2210d256bcfa5becPetr Machataarch_library_init(struct library *lib)
2391383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
2401383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	return 0;
2411383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
2421383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2431383e5bd876baa123b39210c2210d256bcfa5becPetr Machatavoid
2441383e5bd876baa123b39210c2210d256bcfa5becPetr Machataarch_library_destroy(struct library *lib)
2451383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
2461383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
2471383e5bd876baa123b39210c2210d256bcfa5becPetr Machata
2481383e5bd876baa123b39210c2210d256bcfa5becPetr Machataint
2491383e5bd876baa123b39210c2210d256bcfa5becPetr Machataarch_library_clone(struct library *retp, struct library *lib)
2501383e5bd876baa123b39210c2210d256bcfa5becPetr Machata{
2511383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	retp->arch = lib->arch;
2521383e5bd876baa123b39210c2210d256bcfa5becPetr Machata	return 0;
2531383e5bd876baa123b39210c2210d256bcfa5becPetr Machata}
254