libabigail/include/abg-dwarf-reader.h
Dodji Seketeli 5c8c049e70 Bug 19138 - Failure to relate variables address from DWARF and ELF
In this problem report libabigail's DWARF reader wrongly looks up the
address of variables (that it got from DWARF) in the .bss section of
the ELF file.  But then, in these files (generated by the Intel C++
compiler) the variables we are looking at have their addresses in the
.data1 section.

This patch changes the DWARF/ELF reader to make it look for variable
addresses in .data, .data1, .rodata and .bss sections, as it should
be.

	* include/abg-dwarf-reader.h (elf_type::ELF_TYPE_RELOCATABLE): New
	enumerator.
	* src/abg-dwarf-reader.cc (find_section): Factorize this from ...
	(find_text_section, find_bss_section): ... these.
	(find_rodata_section, find_data_section, find_data1_section):
	Define new static functions.
	(elf_file_type): Move this static function definition up.
	(read_context::{get_elf_file_type, address_is_in_section,
	get_data_section_for_variable_address}): New member functions.
	(read_context::maybe_adjust_fn_sym_address): Adjust comment.
	Adjust to use the new
	read_context::get_data_section_for_variable_address().
	* tests/data/test-types-stability/pr19138-elf0: New test input
	binary.
	* tests/data/Makefile.am: Add the new test input binary to the
	test suite.
	* tests/test-types-stability.cc (elf_paths): Take it into account.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-01-08 22:38:58 +01:00

163 lines
3.7 KiB
C++

// -*- Mode: C++ -*-
//
// Copyright (C) 2013-2015 Red Hat, Inc.
//
// This file is part of the GNU Application Binary Interface Generic
// Analysis and Instrumentation Library (libabigail). This library is
// free software; you can redistribute it and/or modify it under the
// terms of the GNU Lesser General Public License as published by the
// Free Software Foundation; either version 3, or (at your option) any
// later version.
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Lesser Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this program; see the file COPYING-LGPLV3. If
// not, see <http://www.gnu.org/licenses/>.
//
// Author: Dodji Seketeli
/// @file
///
/// This file contains the declarations of the entry points to
/// de-serialize an instance of @ref abigail::corpus from a file in
/// elf format, containing dwarf information.
#include <ostream>
#include <elfutils/libdwfl.h>
#include "abg-corpus.h"
#ifndef __ABG_DWARF_READER_H__
#define __ABG_DWARF_READER_H__
namespace abigail
{
namespace dwarf_reader
{
using namespace abigail::ir;
/// The status of the @ref read_corpus_from_elf() call.
enum status
{
/// The status is in an unknown state
STATUS_UNKNOWN = 0,
/// This status is for when the call went OK.
STATUS_OK = 1,
/// This satus is for when the debug info could not be read.
STATUS_DEBUG_INFO_NOT_FOUND = 1 << 1,
/// This status is for when the symbols of the ELF binaries could
/// not be read.
STATUS_NO_SYMBOLS_FOUND = 1 << 2,
};
status
operator|(status, status);
status
operator&(status, status);
status&
operator|=(status&, status);
status&
operator&=(status&, status);
/// The kind of ELF file we are looking at.
enum elf_type
{
ELF_TYPE_EXEC,
ELF_TYPE_DSO,
ELF_TYPE_RELOCATABLE,
ELF_TYPE_UNKNOWN
};
class read_context;
/// A convenience typedef for a smart pointer to a
/// dwarf_reader::read_context.
typedef shared_ptr<read_context> read_context_sptr;
read_context_sptr
create_read_context(const std::string& elf_path,
char** debug_info_root_path,
ir::environment* environment,
bool read_all_types = false);
corpus_sptr
read_corpus_from_elf(read_context& ctxt,
status&);
corpus_sptr
read_corpus_from_elf(const std::string& elf_path,
char** debug_info_root_path,
ir::environment* environment,
bool load_all_types,
status&);
bool
lookup_symbol_from_elf(const string& elf_path,
const string& symbol_name,
bool demangle,
vector<elf_symbol_sptr>& symbols);
bool
lookup_public_function_symbol_from_elf(const string& path,
const string& symname,
vector<elf_symbol_sptr>& func_syms);
status
has_alt_debug_info(read_context& elf_path,
bool& has_alt_di,
string& alt_debug_info_path);
status
has_alt_debug_info(const string& elf_path,
char** debug_info_root_path,
bool& has_alt_di,
string& alt_debug_info_path);
bool
get_soname_of_elf_file(const string& path, string& soname);
bool
get_type_of_elf_file(const string& path, elf_type& type);
void
set_debug_info_root_path(read_context& ctxt,
char** path);
char**
get_debug_info_root_path(read_context& ctxt,
char**& path);
bool
get_show_stats(read_context& ctxt);
void
set_show_stats(read_context& ctxt,
bool f);
void
set_environment(read_context& ctxt,
ir::environment*);
const environment_sptr&
get_environment(const read_context& ctxt);
environment_sptr&
get_environment(read_context& ctxt);
}// end namespace dwarf_reader
}// end namespace abigail
#endif //__ABG_DWARF_READER_H__