17867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// Copyright (c) 2012, Google Inc. 27867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// All rights reserved. 37867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// 47867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// Redistribution and use in source and binary forms, with or without 57867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// modification, are permitted provided that the following conditions are 67867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// met: 77867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// 87867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// * Redistributions of source code must retain the above copyright 97867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// notice, this list of conditions and the following disclaimer. 107867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// * Redistributions in binary form must reproduce the above 117867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// copyright notice, this list of conditions and the following disclaimer 127867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// in the documentation and/or other materials provided with the 137867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// distribution. 147867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// * Neither the name of Google Inc. nor the names of its 157867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// contributors may be used to endorse or promote products derived from 167867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// this software without specific prior written permission. 177867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// 187867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 247867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 257867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 267867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 277867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 287867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 297867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 307867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek#ifndef COMMON_LINUX_ELFUTILS_INL_H__ 317867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek#define COMMON_LINUX_ELFUTILS_INL_H__ 327867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 337867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek#include "common/linux/linux_libc_support.h" 347867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek#include "elfutils.h" 357867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 367867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczareknamespace google_breakpad { 377867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 387867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarektemplate<typename ElfClass, typename T> 397867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarekconst T* GetOffset(const typename ElfClass::Ehdr* elf_header, 407867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek typename ElfClass::Off offset) { 417867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek return reinterpret_cast<const T*>(reinterpret_cast<uintptr_t>(elf_header) + 427867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek offset); 437867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek} 447867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 457867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarektemplate<typename ElfClass> 467867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarekconst typename ElfClass::Shdr* FindElfSectionByName( 477867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek const char* name, 487867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek typename ElfClass::Word section_type, 497867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek const typename ElfClass::Shdr* sections, 507867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek const char* section_names, 517867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek const char* names_end, 527867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek int nsection) { 537867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek assert(name != NULL); 547867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek assert(sections != NULL); 557867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek assert(nsection > 0); 567867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 577867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek int name_len = my_strlen(name); 587867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek if (name_len == 0) 597867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek return NULL; 607867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 617867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek for (int i = 0; i < nsection; ++i) { 627867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek const char* section_name = section_names + sections[i].sh_name; 637867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek if (sections[i].sh_type == section_type && 647867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek names_end - section_name >= name_len + 1 && 657867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek my_strcmp(name, section_name) == 0) { 667867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek return sections + i; 677867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek } 687867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek } 697867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek return NULL; 707867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek} 717867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 727867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek} // namespace google_breakpad 737867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek 747867fcbc885065ceb6afee36b824da9d0dd47fe8ted.mielczarek#endif // COMMON_LINUX_ELFUTILS_INL_H__ 75