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