ptrace-arm.c revision 501edd29b823ce1301d2effdd3a9e4b6e2b20b76
1501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown/* 2501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Copyright (C) 2011 The Android Open Source Project 3501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * 4501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * you may not use this file except in compliance with the License. 6501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * You may obtain a copy of the License at 7501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * 8501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * 10501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * Unless required by applicable law or agreed to in writing, software 11501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * See the License for the specific language governing permissions and 14501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown * limitations under the License. 15501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown */ 16501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 17501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#define LOG_TAG "Corkscrew" 18501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown//#define LOG_NDEBUG 0 19501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 20501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include "../ptrace-arch.h" 21501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 22501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <sys/exec_elf.h> 23501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#include <cutils/log.h> 24501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 25501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#ifndef PT_ARM_EXIDX 26501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#define PT_ARM_EXIDX 0x70000001 27501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown#endif 28501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 29501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownstatic void load_exidx_header(pid_t pid, map_info_t* mi, 30501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uintptr_t* out_exidx_start, size_t* out_exidx_size) { 31501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uint32_t elf_phoff; 32501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uint32_t elf_phnum; 33501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown if (try_get_word(pid, mi->start + offsetof(Elf32_Ehdr, e_phoff), &elf_phoff) 34501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown && try_get_word(pid, mi->start + offsetof(Elf32_Ehdr, e_phnum), &elf_phnum)) { 35501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown for (uint32_t i = 0; i < elf_phnum; i++) { 36501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uintptr_t elf_phdr = mi->start + elf_phoff + i * sizeof(Elf32_Phdr); 37501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uint32_t elf_phdr_type; 38501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown if (!try_get_word(pid, elf_phdr + offsetof(Elf32_Phdr, p_type), &elf_phdr_type)) { 39501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown break; 40501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown } 41501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown if (elf_phdr_type == PT_ARM_EXIDX) { 42501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uint32_t elf_phdr_offset; 43501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown uint32_t elf_phdr_filesz; 44501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown if (!try_get_word(pid, elf_phdr + offsetof(Elf32_Phdr, p_offset), 45501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown &elf_phdr_offset) 46501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown || !try_get_word(pid, elf_phdr + offsetof(Elf32_Phdr, p_filesz), 47501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown &elf_phdr_filesz)) { 48501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown break; 49501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown } 50501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *out_exidx_start = mi->start + elf_phdr_offset; 51501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *out_exidx_size = elf_phdr_filesz; 52501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown return; 53501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown } 54501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown } 55501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown } 56501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *out_exidx_start = 0; 57501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown *out_exidx_size = 0; 58501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} 59501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 60501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid load_ptrace_map_info_data_arch(pid_t pid, map_info_t* mi, map_info_data_t* data) { 61501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown load_exidx_header(pid, mi, &data->exidx_start, &data->exidx_size); 62501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} 63501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown 64501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brownvoid free_ptrace_map_info_data_arch(map_info_t* mi, map_info_data_t* data) { 65501edd29b823ce1301d2effdd3a9e4b6e2b20b76Jeff Brown} 66