2007-11-17 21:05:40 +01:00
|
|
|
#ifndef _DUTIL_H_
|
|
|
|
#define _DUTIL_H_ 1
|
2009-03-14 17:50:36 +01:00
|
|
|
/*
|
2019-01-15 18:28:24 +01:00
|
|
|
SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
2009-03-22 19:02:33 +01:00
|
|
|
* Copyright (C) 2007..2009 Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
|
|
*
|
|
|
|
* Some functions came from the Linux Kernel sources, copyrighted by a
|
|
|
|
* cast of dozens, please see the Linux Kernel git history for details.
|
|
|
|
*/
|
2007-11-17 21:05:40 +01:00
|
|
|
|
2007-12-16 17:55:50 +01:00
|
|
|
#include <stdbool.h>
|
2009-03-18 15:08:23 +01:00
|
|
|
#include <stddef.h>
|
2018-12-26 19:52:26 +01:00
|
|
|
#include <string.h>
|
2009-03-24 20:56:19 +01:00
|
|
|
#include <elf.h>
|
|
|
|
#include <gelf.h>
|
2013-08-15 19:17:21 +02:00
|
|
|
#include <asm/bitsperlong.h>
|
2009-06-18 19:02:29 +02:00
|
|
|
#include "rbtree.h"
|
2007-12-16 17:55:50 +01:00
|
|
|
|
2013-08-15 19:17:21 +02:00
|
|
|
#define BITS_PER_LONG __BITS_PER_LONG
|
|
|
|
|
2007-12-16 17:47:59 +01:00
|
|
|
#ifndef __unused
|
|
|
|
#define __unused __attribute__ ((unused))
|
|
|
|
#endif
|
2007-11-17 21:05:40 +01:00
|
|
|
|
2009-03-06 14:57:41 +01:00
|
|
|
#ifndef __pure
|
|
|
|
#define __pure __attribute__ ((pure))
|
|
|
|
#endif
|
|
|
|
|
dwarves: Remove some more DWARF details from the core
Had to be a big sweeping change, but the regression tests shows just
improvements :-)
Now we stop using an id in struct tag, only storing the type, that now
uses 16 bits only, as CTF does.
Each format loader has to go on adding the types to the core, that
figures out if it is a tag that can be on the tag->type field
(tag__is_tag_type).
Formats that already have the types separated and in sequence, such as
CTF, just ask the core to insert in the types_table directly with its
original ID.
For DWARF, we ask the core to put it on the table, in sequence, and return the
index, that is then stashed with the DWARF specific info (original id, type,
decl_line, etc) and hashed by the original id. Later we recode everything,
looking up via the original type, getting the small_id to put on the tag->type.
The underlying debugging info not needed by the core is stashed in tag->priv,
and the DWARF loader now just allocates sizeof(struct dwarf_tag) at the end of
the core tag and points it there, and makes that info available thru
cu->orig_info. In the future we can ask, when loading a cu, that this info be
trown away, so that we reduce the memory footprint for big multi-cu files such
as the Linux kernel.
There is also a routine to ask for inserting a NULL, as we still have
bugs in the CTF decoding and thus some entries are being lost, to avoid
using an undefined pointer when traversing the types_table the ctf
loader puts a NULL there via cu__table_nullify_type_entry() and then
cu__for_each_type skips those.
There is some more cleanups for leftovers that I avoided cleaning to
reduce this changeset.
And also while doing this I saw that enums can appear without any
enumerators and that an array with DW_TAG_GNU_vector is actually a
different tag, encoded this way till we get to DWARF4 ;-)
So now we don't have to lookup on a hash table looking for DWARF
offsets, we can do the more sensible thing of just indexing the
types_tags array.
Now to do some cleanups and try to get the per cu encoder done. Then
order all the cus per number of type entries, pick the one with more,
then go on merging/recoding the types of the others and putting the
parent linkage in place.
Just to show the extent of the changes:
$ codiff /tmp/libdwarves.so.1.0.0 build/libdwarves.so.1.0.0
/home/acme/git/pahole/dwarves.c:
struct cu | -4048
struct tag | -32
struct ptr_to_member_type | -32
struct namespace | -32
struct type | -32
struct class | -32
struct base_type | -32
struct array_type | -32
struct class_member | -32
struct lexblock | -32
struct ftype | -32
struct function | -64
struct parameter | -32
struct variable | -32
struct inline_expansion | -32
struct label | -32
struct enumerator | -32
17 structs changed
tag__follow_typedef | +3
tag__fprintf_decl_info | +25
array_type__fprintf | +6
type__name | -126
type__find_first_biggest_size_base_type_member | -3
typedef__fprintf | +16
imported_declaration__fprintf | +6
imported_module__fprintf | +3
cu__new | +26
cu__delete | +26
hashtags__hash | -65
hash_64 | -124
hlist_add_head | -78
hashtags__find | -157
cu__hash | -80
cu__add_tag | +20
tag__prefix | -3
cu__find_tag_by_id | -2
cu__find_type_by_id | -3
cu__find_first_typedef_of_type | +38
cu__find_base_type_by_name | +68
cu__find_base_type_by_name_and_size | +72
cu__find_struct_by_name | +59
cus__find_struct_by_name | +8
cus__find_tag_by_id | +5
cus__find_cu_by_name | -6
lexblock__find_tag_by_id | -173
cu__find_variable_by_id | -197
list__find_tag_by_id | -308
cu__find_parameter_by_id | -60
tag__ptr_name | +6
tag__name | +15
variable__type | +13
variable__name | +7
class_member__size | +6
parameter__name | -119
tag__parameter | -14
parameter__type | -143
type__fprintf | -29
union__fprintf | +6
class__add_vtable_entry | -9
type__add_member | -6
type__clone_members | -3
enumeration__add | -6
function__name | -156
ftype__has_parm_of_type | -39
class__find_holes | -27
class__has_hole_ge | -3
type__nr_members_of_type | +3
lexblock__account_inline_expansions | +3
cu__account_inline_expansions | -18
ftype__fprintf_parms | +46
function__tag_fprintf | +24
lexblock__fprintf | -6
ftype__fprintf | +3
function__fprintf_stats | -18
function__size | -6
class__vtable_fprintf | -11
class__fprintf | -21
tag__fprintf | -35
60 functions changed, 513 bytes added, 2054 bytes removed, diff: -1541
/home/acme/git/pahole/ctf_loader.c:
struct ctf_short_type | +0
14 structs changed
type__init | -14
type__new | -9
class__new | -12
create_new_base_type | -7
create_new_base_type_float | -7
create_new_array | -8
create_new_subroutine_type | -9
create_full_members | -18
create_short_members | -18
create_new_class | +1
create_new_union | +1
create_new_enumeration | -19
create_new_forward_decl | -2
create_new_typedef | +3
create_new_tag | -5
load_types | +16
class__fixup_ctf_bitfields | -3
17 functions changed, 21 bytes added, 131 bytes removed, diff: -110
/home/acme/git/pahole/dwarf_loader.c:
17 structs changed
zalloc | -56
tag__init | +3
array_type__new | +20
type__init | -24
class_member__new | +46
inline_expansion__new | +12
class__new | +81
lexblock__init | +19
function__new | +43
die__create_new_array | +20
die__create_new_parameter | +4
die__create_new_label | +4
die__create_new_subroutine_type | +113
die__create_new_enumeration | -21
die__process_class | +79
die__process_namespace | +76
die__create_new_inline_expansion | +4
die__process_function | +147
__die__process_tag | +34
die__process_unit | +56
die__process | +90
21 functions changed, 851 bytes added, 101 bytes removed, diff: +750
/home/acme/git/pahole/dwarves.c:
struct ptr_table | +16
struct cu_orig_info | +32
2 structs changed
tag__decl_line | +68
tag__decl_file | +70
tag__orig_id | +71
ptr_table__init | +46
ptr_table__exit | +37
ptr_table__add | +183
ptr_table__add_with_id | +165
ptr_table__entry | +64
cu__table_add_tag | +171
cu__table_nullify_type_entry | +38
10 functions changed, 913 bytes added, diff: +913
/home/acme/git/pahole/ctf_loader.c:
2 structs changed
tag__alloc | +52
1 function changed, 52 bytes added, diff: +52
/home/acme/git/pahole/dwarf_loader.c:
struct dwarf_tag | +48
struct dwarf_cu | +4104
4 structs changed
dwarf_cu__init | +83
hashtags__hash | +61
hash_64 | +124
hlist_add_head | +78
hashtags__find | +161
cu__hash | +95
tag__is_tag_type | +171
tag__is_type | +85
tag__is_union | +28
tag__is_struct | +57
tag__is_typedef | +28
tag__is_enumeration | +28
dwarf_cu__find_tag_by_id | +56
dwarf_cu__find_type_by_id | +63
tag__alloc | +114
__tag__print_type_not_found | +108
namespace__recode_dwarf_types | +346
tag__namespace | +14
tag__has_namespace | +86
tag__is_namespace | +28
type__recode_dwarf_specification | +182
tag__type | +14
__tag__print_abstract_origin_not_found | +105
ftype__recode_dwarf_types | +322
tag__ftype | +14
tag__parameter | +14
lexblock__recode_dwarf_types | +736
tag__lexblock | +14
tag__label | +14
tag__recode_dwarf_type | +766
tag__ptr_to_member_type | +14
cu__recode_dwarf_types_table | +88
cu__recode_dwarf_types | +48
dwarf_tag__decl_file | +77
strings__ptr | +33
dwarf_tag__decl_line | +59
dwarf_tag__orig_id | +59
dwarf_tag__orig_type | +59
38 functions changed, 4432 bytes added, diff: +4432
build/libdwarves.so.1.0.0:
147 functions changed, 6782 bytes added, 2286 bytes removed, diff: +4496
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2009-03-06 00:29:35 +01:00
|
|
|
#define roundup(x,y) ((((x) + ((y) - 1)) / (y)) * (y))
|
|
|
|
|
2009-03-22 19:02:33 +01:00
|
|
|
static inline __attribute__((const)) bool is_power_of_2(unsigned long n)
|
|
|
|
{
|
|
|
|
return (n != 0 && ((n & (n - 1)) == 0));
|
|
|
|
}
|
|
|
|
|
2013-08-15 19:17:21 +02:00
|
|
|
/**
|
|
|
|
* fls - find last (most-significant) bit set
|
|
|
|
* @x: the word to search
|
|
|
|
*
|
|
|
|
* This is defined the same way as ffs.
|
|
|
|
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
|
|
|
*/
|
|
|
|
static __always_inline int fls(int x)
|
|
|
|
{
|
|
|
|
return x ? sizeof(x) * 8 - __builtin_clz(x) : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* fls64 - find last set bit in a 64-bit word
|
|
|
|
* @x: the word to search
|
|
|
|
*
|
|
|
|
* This is defined in a similar way as the libc and compiler builtin
|
|
|
|
* ffsll, but returns the position of the most significant set bit.
|
|
|
|
*
|
|
|
|
* fls64(value) returns 0 if value is 0 or the position of the last
|
|
|
|
* set bit if value is nonzero. The last (most significant) bit is
|
|
|
|
* at position 64.
|
|
|
|
*/
|
|
|
|
#if BITS_PER_LONG == 32
|
|
|
|
static __always_inline int fls64(uint64_t x)
|
|
|
|
{
|
|
|
|
uint32_t h = x >> 32;
|
|
|
|
if (h)
|
|
|
|
return fls(h) + 32;
|
|
|
|
return fls(x);
|
|
|
|
}
|
|
|
|
#elif BITS_PER_LONG == 64
|
|
|
|
/**
|
|
|
|
* __fls - find last (most-significant) set bit in a long word
|
|
|
|
* @word: the word to search
|
|
|
|
*
|
|
|
|
* Undefined if no set bit exists, so code should check against 0 first.
|
|
|
|
*/
|
|
|
|
static __always_inline unsigned long __fls(unsigned long word)
|
|
|
|
{
|
|
|
|
int num = BITS_PER_LONG - 1;
|
|
|
|
|
|
|
|
#if BITS_PER_LONG == 64
|
|
|
|
if (!(word & (~0ul << 32))) {
|
|
|
|
num -= 32;
|
|
|
|
word <<= 32;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
|
|
|
|
num -= 16;
|
|
|
|
word <<= 16;
|
|
|
|
}
|
|
|
|
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
|
|
|
|
num -= 8;
|
|
|
|
word <<= 8;
|
|
|
|
}
|
|
|
|
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
|
|
|
|
num -= 4;
|
|
|
|
word <<= 4;
|
|
|
|
}
|
|
|
|
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
|
|
|
|
num -= 2;
|
|
|
|
word <<= 2;
|
|
|
|
}
|
|
|
|
if (!(word & (~0ul << (BITS_PER_LONG-1))))
|
|
|
|
num -= 1;
|
|
|
|
return num;
|
|
|
|
}
|
|
|
|
|
|
|
|
static __always_inline int fls64(uint64_t x)
|
|
|
|
{
|
|
|
|
if (x == 0)
|
|
|
|
return 0;
|
|
|
|
return __fls(x) + 1;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
#error BITS_PER_LONG not 32 or 64
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static inline unsigned fls_long(unsigned long l)
|
|
|
|
{
|
|
|
|
if (sizeof(l) == 4)
|
|
|
|
return fls(l);
|
|
|
|
return fls64(l);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* round up to nearest power of two
|
|
|
|
*/
|
|
|
|
static inline __attribute__((const))
|
|
|
|
unsigned long __roundup_pow_of_two(unsigned long n)
|
|
|
|
{
|
|
|
|
return 1UL << fls_long(n - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* non-constant log of base 2 calculators
|
|
|
|
* - the arch may override these in asm/bitops.h if they can be implemented
|
|
|
|
* more efficiently than using fls() and fls64()
|
|
|
|
* - the arch is not required to handle n==0 if implementing the fallback
|
|
|
|
*/
|
|
|
|
static inline __attribute__((const))
|
|
|
|
int __ilog2_u32(uint32_t n)
|
|
|
|
{
|
|
|
|
return fls(n) - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline __attribute__((const))
|
|
|
|
int __ilog2_u64(uint64_t n)
|
|
|
|
{
|
|
|
|
return fls64(n) - 1;
|
|
|
|
}
|
|
|
|
|
2016-03-15 15:42:16 +01:00
|
|
|
/*
|
|
|
|
* deal with unrepresentable constant logarithms
|
|
|
|
*/
|
2018-12-26 19:50:34 +01:00
|
|
|
extern __attribute__((const))
|
2016-03-15 15:42:16 +01:00
|
|
|
int ____ilog2_NaN(void);
|
|
|
|
|
2013-08-15 19:17:21 +02:00
|
|
|
/**
|
|
|
|
* ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
|
|
|
|
* @n - parameter
|
|
|
|
*
|
|
|
|
* constant-capable log of base 2 calculation
|
|
|
|
* - this can be used to initialise global variables from constant data, hence
|
|
|
|
* the massive ternary operator construction
|
|
|
|
*
|
|
|
|
* selects the appropriately-sized optimised version depending on sizeof(n)
|
|
|
|
*/
|
|
|
|
#define ilog2(n) \
|
|
|
|
( \
|
|
|
|
__builtin_constant_p(n) ? ( \
|
|
|
|
(n) < 1 ? ____ilog2_NaN() : \
|
|
|
|
(n) & (1ULL << 63) ? 63 : \
|
|
|
|
(n) & (1ULL << 62) ? 62 : \
|
|
|
|
(n) & (1ULL << 61) ? 61 : \
|
|
|
|
(n) & (1ULL << 60) ? 60 : \
|
|
|
|
(n) & (1ULL << 59) ? 59 : \
|
|
|
|
(n) & (1ULL << 58) ? 58 : \
|
|
|
|
(n) & (1ULL << 57) ? 57 : \
|
|
|
|
(n) & (1ULL << 56) ? 56 : \
|
|
|
|
(n) & (1ULL << 55) ? 55 : \
|
|
|
|
(n) & (1ULL << 54) ? 54 : \
|
|
|
|
(n) & (1ULL << 53) ? 53 : \
|
|
|
|
(n) & (1ULL << 52) ? 52 : \
|
|
|
|
(n) & (1ULL << 51) ? 51 : \
|
|
|
|
(n) & (1ULL << 50) ? 50 : \
|
|
|
|
(n) & (1ULL << 49) ? 49 : \
|
|
|
|
(n) & (1ULL << 48) ? 48 : \
|
|
|
|
(n) & (1ULL << 47) ? 47 : \
|
|
|
|
(n) & (1ULL << 46) ? 46 : \
|
|
|
|
(n) & (1ULL << 45) ? 45 : \
|
|
|
|
(n) & (1ULL << 44) ? 44 : \
|
|
|
|
(n) & (1ULL << 43) ? 43 : \
|
|
|
|
(n) & (1ULL << 42) ? 42 : \
|
|
|
|
(n) & (1ULL << 41) ? 41 : \
|
|
|
|
(n) & (1ULL << 40) ? 40 : \
|
|
|
|
(n) & (1ULL << 39) ? 39 : \
|
|
|
|
(n) & (1ULL << 38) ? 38 : \
|
|
|
|
(n) & (1ULL << 37) ? 37 : \
|
|
|
|
(n) & (1ULL << 36) ? 36 : \
|
|
|
|
(n) & (1ULL << 35) ? 35 : \
|
|
|
|
(n) & (1ULL << 34) ? 34 : \
|
|
|
|
(n) & (1ULL << 33) ? 33 : \
|
|
|
|
(n) & (1ULL << 32) ? 32 : \
|
|
|
|
(n) & (1ULL << 31) ? 31 : \
|
|
|
|
(n) & (1ULL << 30) ? 30 : \
|
|
|
|
(n) & (1ULL << 29) ? 29 : \
|
|
|
|
(n) & (1ULL << 28) ? 28 : \
|
|
|
|
(n) & (1ULL << 27) ? 27 : \
|
|
|
|
(n) & (1ULL << 26) ? 26 : \
|
|
|
|
(n) & (1ULL << 25) ? 25 : \
|
|
|
|
(n) & (1ULL << 24) ? 24 : \
|
|
|
|
(n) & (1ULL << 23) ? 23 : \
|
|
|
|
(n) & (1ULL << 22) ? 22 : \
|
|
|
|
(n) & (1ULL << 21) ? 21 : \
|
|
|
|
(n) & (1ULL << 20) ? 20 : \
|
|
|
|
(n) & (1ULL << 19) ? 19 : \
|
|
|
|
(n) & (1ULL << 18) ? 18 : \
|
|
|
|
(n) & (1ULL << 17) ? 17 : \
|
|
|
|
(n) & (1ULL << 16) ? 16 : \
|
|
|
|
(n) & (1ULL << 15) ? 15 : \
|
|
|
|
(n) & (1ULL << 14) ? 14 : \
|
|
|
|
(n) & (1ULL << 13) ? 13 : \
|
|
|
|
(n) & (1ULL << 12) ? 12 : \
|
|
|
|
(n) & (1ULL << 11) ? 11 : \
|
|
|
|
(n) & (1ULL << 10) ? 10 : \
|
|
|
|
(n) & (1ULL << 9) ? 9 : \
|
|
|
|
(n) & (1ULL << 8) ? 8 : \
|
|
|
|
(n) & (1ULL << 7) ? 7 : \
|
|
|
|
(n) & (1ULL << 6) ? 6 : \
|
|
|
|
(n) & (1ULL << 5) ? 5 : \
|
|
|
|
(n) & (1ULL << 4) ? 4 : \
|
|
|
|
(n) & (1ULL << 3) ? 3 : \
|
|
|
|
(n) & (1ULL << 2) ? 2 : \
|
|
|
|
(n) & (1ULL << 1) ? 1 : \
|
|
|
|
(n) & (1ULL << 0) ? 0 : \
|
|
|
|
____ilog2_NaN() \
|
|
|
|
) : \
|
|
|
|
(sizeof(n) <= 4) ? \
|
|
|
|
__ilog2_u32(n) : \
|
|
|
|
__ilog2_u64(n) \
|
|
|
|
)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* roundup_pow_of_two - round the given value up to nearest power of two
|
|
|
|
* @n - parameter
|
|
|
|
*
|
|
|
|
* round the given value up to the nearest power of two
|
|
|
|
* - the result is undefined when n == 0
|
|
|
|
* - this can be used to initialise global variables from constant data
|
|
|
|
*/
|
|
|
|
#define roundup_pow_of_two(n) \
|
|
|
|
( \
|
|
|
|
__builtin_constant_p(n) ? ( \
|
|
|
|
(n == 1) ? 1 : \
|
|
|
|
(1UL << (ilog2((n) - 1) + 1)) \
|
|
|
|
) : \
|
|
|
|
__roundup_pow_of_two(n) \
|
|
|
|
)
|
|
|
|
|
2009-02-13 13:57:23 +01:00
|
|
|
/* We need define two variables, argp_program_version_hook and
|
|
|
|
argp_program_bug_address, in all programs. argp.h declares these
|
|
|
|
variables as non-const (which is correct in general). But we can
|
|
|
|
do better, it is not going to change. So we want to move them into
|
|
|
|
the .rodata section. Define macros to do the trick. */
|
|
|
|
#define ARGP_PROGRAM_VERSION_HOOK_DEF \
|
|
|
|
void (*const apvh) (FILE *, struct argp_state *) \
|
|
|
|
__asm ("argp_program_version_hook")
|
|
|
|
#define ARGP_PROGRAM_BUG_ADDRESS_DEF \
|
|
|
|
const char *const apba__ __asm ("argp_program_bug_address")
|
|
|
|
|
2009-06-18 19:02:29 +02:00
|
|
|
struct str_node {
|
|
|
|
struct rb_node rb_node;
|
|
|
|
const char *s;
|
|
|
|
};
|
|
|
|
|
2007-12-16 17:55:50 +01:00
|
|
|
struct strlist {
|
2009-06-18 19:02:29 +02:00
|
|
|
struct rb_root entries;
|
2007-12-16 17:55:50 +01:00
|
|
|
bool dupstr;
|
2007-11-17 21:05:40 +01:00
|
|
|
};
|
|
|
|
|
2007-12-16 17:55:50 +01:00
|
|
|
struct strlist *strlist__new(bool dupstr);
|
2014-01-06 20:42:59 +01:00
|
|
|
void strlist__delete(struct strlist *slist);
|
2007-12-16 17:55:50 +01:00
|
|
|
|
2014-01-06 20:42:59 +01:00
|
|
|
void strlist__remove(struct strlist *slist, struct str_node *sn);
|
|
|
|
int strlist__load(struct strlist *slist, const char *filename);
|
|
|
|
int strlist__add(struct strlist *slist, const char *str);
|
2007-11-17 21:05:40 +01:00
|
|
|
|
2014-01-06 20:42:59 +01:00
|
|
|
bool strlist__has_entry(struct strlist *slist, const char *entry);
|
2009-06-18 19:02:29 +02:00
|
|
|
|
2014-01-06 20:42:59 +01:00
|
|
|
static inline bool strlist__empty(const struct strlist *slist)
|
2009-06-18 19:02:29 +02:00
|
|
|
{
|
2014-01-06 20:42:59 +01:00
|
|
|
return rb_first(&slist->entries) == NULL;
|
2009-06-18 19:02:29 +02:00
|
|
|
}
|
2007-11-17 21:05:40 +01:00
|
|
|
|
2018-12-20 18:52:25 +01:00
|
|
|
/**
|
|
|
|
* strstarts - does @str start with @prefix?
|
|
|
|
* @str: string to examine
|
|
|
|
* @prefix: prefix to look for.
|
|
|
|
*/
|
|
|
|
static inline bool strstarts(const char *str, const char *prefix)
|
|
|
|
{
|
|
|
|
return strncmp(str, prefix, strlen(prefix)) == 0;
|
|
|
|
}
|
|
|
|
|
2009-03-18 15:08:23 +01:00
|
|
|
void *zalloc(const size_t size);
|
|
|
|
|
2009-03-24 20:56:19 +01:00
|
|
|
Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
|
2009-04-03 16:53:05 +02:00
|
|
|
GElf_Shdr *shp, const char *name, size_t *index);
|
2009-03-24 20:56:19 +01:00
|
|
|
|
2011-03-17 19:33:28 +01:00
|
|
|
#ifndef SHT_GNU_ATTRIBUTES
|
|
|
|
/* Just a way to check if we're using an old elfutils version */
|
|
|
|
static inline int elf_getshdrstrndx(Elf *elf, size_t *dst)
|
|
|
|
{
|
|
|
|
return elf_getshstrndx(elf, dst);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2007-11-17 21:05:40 +01:00
|
|
|
#endif /* _DUTIL_H_ */
|