/*
 * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _OBJTOOL_ELF_H
#define _OBJTOOL_ELF_H

#include <stdio.h>
#include <gelf.h>
#include <linux/list.h>
#include <linux/hashtable.h>

#ifdef LIBELF_USE_DEPRECATED
# define elf_getshdrnum    elf_getshnum
# define elf_getshdrstrndx elf_getshstrndx
#endif

struct section {
	struct list_head list;
	GElf_Shdr sh;
	struct list_head symbol_list;
	DECLARE_HASHTABLE(symbol_hash, 8);
	struct list_head rela_list;
	DECLARE_HASHTABLE(rela_hash, 16);
	struct section *base, *rela;
	struct symbol *sym;
	Elf_Data *elf_data;
	char *name;
	int idx;
	unsigned long data;
	unsigned int len;
};

struct symbol {
	struct list_head list;
	struct hlist_node hash;
	GElf_Sym sym;
	struct section *sec;
	char *name;
	unsigned int idx;
	unsigned char bind, type;
	unsigned long offset;
	unsigned int len;
};

struct rela {
	struct list_head list;
	struct hlist_node hash;
	GElf_Rela rela;
	struct symbol *sym;
	unsigned int type;
	unsigned long offset;
	int addend;
};

struct elf {
	Elf *elf;
	GElf_Ehdr ehdr;
	int fd;
	char *name;
	struct list_head sections;
	DECLARE_HASHTABLE(rela_hash, 16);
};


struct elf *elf_open(const char *name);
struct section *find_section_by_name(struct elf *elf, const char *name);
struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset);
struct rela *find_rela_by_dest(struct section *sec, unsigned long offset);
struct rela *find_rela_by_dest_range(struct section *sec, unsigned long offset,
				     unsigned int len);
struct symbol *find_containing_func(struct section *sec, unsigned long offset);
void elf_close(struct elf *elf);



#endif /* _OBJTOOL_ELF_H */
perf/Documentation/perf-buildid-list.txt'>
<input type='hidden' name='id' value='9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/log/?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'>root</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'>tools</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'>perf</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/Documentation?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'>Documentation</a>/<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/Documentation/perf-buildid-list.txt?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4'>perf-buildid-list.txt</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th class='left'>Age</th><th class='left'>Commit message (<a href='/cgit.cgi/linux/net-next.git/log/tools/perf/Documentation/perf-buildid-list.txt?id=9303ab2b3402b60f6c39abfdbfa4ce00fce8bee4&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Files</th><th class='left'>Lines</th></tr>