Remove STT_IFUNC support.
This commit is contained in:
parent
5995b57073
commit
0f88be7a13
|
@ -1,3 +1,31 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* elf-bfd.h (struct bfd_elf_section_data): Remove indirect_relocs
|
||||
field.
|
||||
(_bfd_elf_make_ifunc_reloc_section): Remove prototype.
|
||||
* elf.c (swap_out_syms): Remove STT_IFUNC support.
|
||||
(elf_find_function): Likewise.
|
||||
* elf32-arm.c (arm_elf_find_function): Likewise.
|
||||
(elf32_arm_adjust_dynamic_symbol): Likewise.
|
||||
(elf32_arm_swap_symbol_in): Likewise.
|
||||
(elf32_arm_is_function_type): Likewise.
|
||||
* elf32-i386.c (is_indirect_symbol): Delete.
|
||||
(elf_i386_check_relocs): Remove STT_IFUNC support.
|
||||
(allocate_dynrelocs): Likewise.
|
||||
(elf_i386_relocate_section): Likewise.
|
||||
* elf64-x86-64.c (is_indirect_symbol): Delete.
|
||||
(elf64_x86_64_check_relocs): Remove STT_IFUNC support.
|
||||
(allocate_dynrelocs): Likewise.
|
||||
(elf64_x86_64_relocate_section): Likewise.
|
||||
* elfcode.h (elf_slurp_symbol_table): Likewise.
|
||||
* elflink.c (_bfd_elf_adjust_symbol): Likewise.
|
||||
(get_ifunc_reloc_section_name): Delete.
|
||||
(_bfd_elf_make_ifunc_reloc_section): Delete.
|
||||
* syms.c (BSF_INDIRECT_FUNCTION): Delete.
|
||||
(bfd_print_symbol_vandf): Remove STT_IFUNC support.
|
||||
(bfd_decode_symclass): Likewise.
|
||||
* bfd-in2.h: Regenerate.
|
||||
|
||||
2008-12-20 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* elf32-cris.c (cris_elf_howto_table): Add entry for R_CRIS_32_IE.
|
||||
|
|
|
@ -4472,13 +4472,6 @@ typedef struct bfd_symbol
|
|||
perhaps others someday. */
|
||||
#define BSF_FUNCTION (1 << 3)
|
||||
|
||||
/* The symbol is an indirect code object. Unrelated to BSF_INDIRECT.
|
||||
Relocations against a symbol with this flag have to evaluated at
|
||||
run-time, where the function pointed to by this symbol is invoked
|
||||
in order to determine the value to be used in the relocation.
|
||||
BSF_FUNCTION must also be set for symbols with this flag. */
|
||||
#define BSF_INDIRECT_FUNCTION (1 << 4)
|
||||
|
||||
/* Used by the linker. */
|
||||
#define BSF_KEEP (1 << 5)
|
||||
#define BSF_KEEP_G (1 << 6)
|
||||
|
|
|
@ -1287,9 +1287,6 @@ struct bfd_elf_section_data
|
|||
/* A pointer to the bfd section used for dynamic relocs. */
|
||||
asection *sreloc;
|
||||
|
||||
/* A pointer to the bfd section used for dynamic relocs against ifunc symbols. */
|
||||
asection *indirect_relocs;
|
||||
|
||||
union {
|
||||
/* Group name, if this section is a member of a group. */
|
||||
const char *name;
|
||||
|
@ -1771,8 +1768,6 @@ extern asection * _bfd_elf_get_dynamic_reloc_section
|
|||
(bfd *, asection *, bfd_boolean);
|
||||
extern asection * _bfd_elf_make_dynamic_reloc_section
|
||||
(asection *, bfd *, unsigned int, bfd *, bfd_boolean);
|
||||
extern asection * _bfd_elf_make_ifunc_reloc_section
|
||||
(bfd *, asection *, bfd *, unsigned int);
|
||||
extern long _bfd_elf_get_dynamic_reloc_upper_bound
|
||||
(bfd *);
|
||||
extern long _bfd_elf_canonicalize_dynamic_reloc
|
||||
|
|
|
@ -6427,8 +6427,6 @@ Unable to find equivalent output section for symbol '%s' from section '%s'"),
|
|||
|
||||
if ((flags & BSF_THREAD_LOCAL) != 0)
|
||||
type = STT_TLS;
|
||||
else if ((flags & BSF_INDIRECT_FUNCTION) != 0)
|
||||
type = STT_IFUNC;
|
||||
else if ((flags & BSF_FUNCTION) != 0)
|
||||
type = STT_FUNC;
|
||||
else if ((flags & BSF_OBJECT) != 0)
|
||||
|
@ -7122,7 +7120,6 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
|
|||
continue;
|
||||
case STT_NOTYPE:
|
||||
case STT_FUNC:
|
||||
case STT_IFUNC:
|
||||
if (bfd_get_section (&q->symbol) == section
|
||||
&& q->symbol.value >= low_func
|
||||
&& q->symbol.value <= offset)
|
||||
|
@ -8941,10 +8938,10 @@ _bfd_elf_set_osabi (bfd * abfd,
|
|||
|
||||
/* Return TRUE for ELF symbol types that represent functions.
|
||||
This is the default version of this function, which is sufficient for
|
||||
most targets. It returns true if TYPE is STT_FUNC or STT_IFUNC. */
|
||||
most targets. It returns true if TYPE is STT_FUNC. */
|
||||
|
||||
bfd_boolean
|
||||
_bfd_elf_is_function_type (unsigned int type)
|
||||
{
|
||||
return (type == STT_FUNC || type == STT_IFUNC);
|
||||
return (type == STT_FUNC);
|
||||
}
|
||||
|
|
|
@ -9430,7 +9430,6 @@ arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED,
|
|||
filename = bfd_asymbol_name (&q->symbol);
|
||||
break;
|
||||
case STT_FUNC:
|
||||
case STT_IFUNC:
|
||||
case STT_ARM_TFUNC:
|
||||
case STT_NOTYPE:
|
||||
/* Skip mapping symbols. */
|
||||
|
@ -9556,7 +9555,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info,
|
|||
/* If this is a function, put it in the procedure linkage table. We
|
||||
will fill in the contents of the procedure linkage table later,
|
||||
when we know the address of the .got section. */
|
||||
if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC || h->type == STT_IFUNC
|
||||
if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC
|
||||
|| h->needs_plt)
|
||||
{
|
||||
if (h->plt.refcount <= 0
|
||||
|
@ -11730,8 +11729,7 @@ elf32_arm_swap_symbol_in (bfd * abfd,
|
|||
|
||||
/* New EABI objects mark thumb function symbols by setting the low bit of
|
||||
the address. Turn these into STT_ARM_TFUNC. */
|
||||
if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC
|
||||
|| ELF_ST_TYPE (dst->st_info) == STT_IFUNC)
|
||||
if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC)
|
||||
&& (dst->st_value & 1))
|
||||
{
|
||||
dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC);
|
||||
|
@ -11832,7 +11830,7 @@ elf32_arm_additional_program_headers (bfd *abfd,
|
|||
static bfd_boolean
|
||||
elf32_arm_is_function_type (unsigned int type)
|
||||
{
|
||||
return (type == STT_FUNC) || (type == STT_ARM_TFUNC) || (type == STT_IFUNC);
|
||||
return (type == STT_FUNC) || (type == STT_ARM_TFUNC);
|
||||
}
|
||||
|
||||
/* We use this to override swap_symbol_in and swap_symbol_out. */
|
||||
|
|
|
@ -1193,26 +1193,6 @@ elf_i386_tls_transition (struct bfd_link_info *info, bfd *abfd,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Returns true if the hash entry refers to a symbol
|
||||
marked for indirect handling during reloc processing. */
|
||||
|
||||
static bfd_boolean
|
||||
is_indirect_symbol (bfd * abfd, struct elf_link_hash_entry * h)
|
||||
{
|
||||
const struct elf_backend_data * bed;
|
||||
|
||||
if (abfd == NULL || h == NULL)
|
||||
return FALSE;
|
||||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
return h->type == STT_IFUNC
|
||||
&& bed != NULL
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE);
|
||||
}
|
||||
|
||||
/* Look through the relocs for a section during the first phase, and
|
||||
calculate needed space in the global offset table, procedure linkage
|
||||
table, and dynamic reloc sections. */
|
||||
|
@ -1472,8 +1452,7 @@ elf_i386_check_relocs (bfd *abfd,
|
|||
&& (sec->flags & SEC_ALLOC) != 0
|
||||
&& h != NULL
|
||||
&& (h->root.type == bfd_link_hash_defweak
|
||||
|| !h->def_regular))
|
||||
|| is_indirect_symbol (abfd, h))
|
||||
|| !h->def_regular)))
|
||||
{
|
||||
struct elf_i386_dyn_relocs *p;
|
||||
struct elf_i386_dyn_relocs **head;
|
||||
|
@ -1493,9 +1472,6 @@ elf_i386_check_relocs (bfd *abfd,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (is_indirect_symbol (abfd, h))
|
||||
(void) _bfd_elf_make_ifunc_reloc_section (abfd, sec, htab->elf.dynobj, 2);
|
||||
|
||||
/* If this is a global symbol, we count the number of
|
||||
relocations we need for this symbol. */
|
||||
if (h != NULL)
|
||||
|
@ -2057,15 +2033,6 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (is_indirect_symbol (info->output_bfd, h))
|
||||
{
|
||||
if (h->dynindx == -1
|
||||
&& !h->forced_local)
|
||||
{
|
||||
if (! bfd_elf_link_record_dynamic_symbol (info, h))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (ELIMINATE_COPY_RELOCS)
|
||||
{
|
||||
/* For the non-shared case, discard space for relocs against
|
||||
|
@ -2104,11 +2071,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
|
|||
{
|
||||
asection *sreloc;
|
||||
|
||||
if (! info->shared
|
||||
&& is_indirect_symbol (info->output_bfd, h))
|
||||
sreloc = elf_section_data (p->sec)->indirect_relocs;
|
||||
else
|
||||
sreloc = elf_section_data (p->sec)->sreloc;
|
||||
sreloc = elf_section_data (p->sec)->sreloc;
|
||||
|
||||
BFD_ASSERT (sreloc != NULL);
|
||||
sreloc->size += p->count * sizeof (Elf32_External_Rel);
|
||||
|
@ -2919,8 +2882,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
&& ((h->def_dynamic
|
||||
&& !h->def_regular)
|
||||
|| h->root.type == bfd_link_hash_undefweak
|
||||
|| h->root.type == bfd_link_hash_undefined))
|
||||
|| is_indirect_symbol (output_bfd, h))
|
||||
|| h->root.type == bfd_link_hash_undefined)))
|
||||
{
|
||||
Elf_Internal_Rela outrel;
|
||||
bfd_byte *loc;
|
||||
|
@ -2960,10 +2922,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
outrel.r_info = ELF32_R_INFO (0, R_386_RELATIVE);
|
||||
}
|
||||
|
||||
if ((! info->shared) && is_indirect_symbol (output_bfd, h))
|
||||
sreloc = elf_section_data (input_section)->indirect_relocs;
|
||||
else
|
||||
sreloc = elf_section_data (input_section)->sreloc;
|
||||
sreloc = elf_section_data (input_section)->sreloc;
|
||||
|
||||
BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
|
||||
|
||||
|
@ -2976,7 +2935,7 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||
not want to fiddle with the addend. Otherwise, we
|
||||
need to include the symbol value so that it becomes
|
||||
an addend for the dynamic reloc. */
|
||||
if (! relocate || is_indirect_symbol (output_bfd, h))
|
||||
if (! relocate)
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -974,26 +974,6 @@ elf64_x86_64_tls_transition (struct bfd_link_info *info, bfd *abfd,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* Returns true if the hash entry refers to a symbol
|
||||
marked for indirect handling during reloc processing. */
|
||||
|
||||
static bfd_boolean
|
||||
is_indirect_symbol (bfd * abfd, struct elf_link_hash_entry * h)
|
||||
{
|
||||
const struct elf_backend_data * bed;
|
||||
|
||||
if (abfd == NULL || h == NULL)
|
||||
return FALSE;
|
||||
|
||||
bed = get_elf_backend_data (abfd);
|
||||
|
||||
return h->type == STT_IFUNC
|
||||
&& bed != NULL
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE);
|
||||
}
|
||||
|
||||
/* Look through the relocs for a section during the first phase, and
|
||||
calculate needed space in the global offset table, procedure
|
||||
linkage table, and dynamic reloc sections. */
|
||||
|
@ -1275,10 +1255,8 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
If on the other hand, we are creating an executable, we
|
||||
may need to keep relocations for symbols satisfied by a
|
||||
dynamic library if we manage to avoid copy relocs for the
|
||||
symbol.
|
||||
symbol. */
|
||||
|
||||
Also we must keep any relocations against IFUNC symbols as
|
||||
they will be evaluated at load time. */
|
||||
if ((info->shared
|
||||
&& (sec->flags & SEC_ALLOC) != 0
|
||||
&& (((r_type != R_X86_64_PC8)
|
||||
|
@ -1294,8 +1272,7 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
&& (sec->flags & SEC_ALLOC) != 0
|
||||
&& h != NULL
|
||||
&& (h->root.type == bfd_link_hash_defweak
|
||||
|| !h->def_regular))
|
||||
|| is_indirect_symbol (abfd, h))
|
||||
|| !h->def_regular)))
|
||||
{
|
||||
struct elf64_x86_64_dyn_relocs *p;
|
||||
struct elf64_x86_64_dyn_relocs **head;
|
||||
|
@ -1315,9 +1292,6 @@ elf64_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (is_indirect_symbol (abfd, h))
|
||||
(void) _bfd_elf_make_ifunc_reloc_section (abfd, sec, htab->elf.dynobj, 2);
|
||||
|
||||
/* If this is a global symbol, we count the number of
|
||||
relocations we need for this symbol. */
|
||||
if (h != NULL)
|
||||
|
@ -1857,13 +1831,6 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (is_indirect_symbol (info->output_bfd, h))
|
||||
{
|
||||
if (h->dynindx == -1
|
||||
&& ! h->forced_local
|
||||
&& ! bfd_elf_link_record_dynamic_symbol (info, h))
|
||||
return FALSE;
|
||||
}
|
||||
else if (ELIMINATE_COPY_RELOCS)
|
||||
{
|
||||
/* For the non-shared case, discard space for relocs against
|
||||
|
@ -1902,11 +1869,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
|
|||
{
|
||||
asection * sreloc;
|
||||
|
||||
if (! info->shared
|
||||
&& is_indirect_symbol (info->output_bfd, h))
|
||||
sreloc = elf_section_data (p->sec)->indirect_relocs;
|
||||
else
|
||||
sreloc = elf_section_data (p->sec)->sreloc;
|
||||
sreloc = elf_section_data (p->sec)->sreloc;
|
||||
|
||||
BFD_ASSERT (sreloc != NULL);
|
||||
|
||||
|
@ -2721,8 +2684,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
&& ((h->def_dynamic
|
||||
&& !h->def_regular)
|
||||
|| h->root.type == bfd_link_hash_undefweak
|
||||
|| h->root.type == bfd_link_hash_undefined))
|
||||
|| is_indirect_symbol (output_bfd, h))
|
||||
|| h->root.type == bfd_link_hash_undefined)))
|
||||
{
|
||||
Elf_Internal_Rela outrel;
|
||||
bfd_byte *loc;
|
||||
|
@ -2808,10 +2770,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
}
|
||||
}
|
||||
|
||||
if ((! info->shared) && is_indirect_symbol (output_bfd, h))
|
||||
sreloc = elf_section_data (input_section)->indirect_relocs;
|
||||
else
|
||||
sreloc = elf_section_data (input_section)->sreloc;
|
||||
sreloc = elf_section_data (input_section)->sreloc;
|
||||
|
||||
BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
|
||||
|
||||
|
@ -2823,7 +2782,7 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||
not want to fiddle with the addend. Otherwise, we
|
||||
need to include the symbol value so that it becomes
|
||||
an addend for the dynamic reloc. */
|
||||
if (! relocate || is_indirect_symbol (output_bfd, h))
|
||||
if (! relocate)
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -1311,9 +1311,6 @@ elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
|
|||
case STT_SRELC:
|
||||
sym->symbol.flags |= BSF_SRELC;
|
||||
break;
|
||||
case STT_IFUNC:
|
||||
sym->symbol.flags |= BSF_INDIRECT_FUNCTION;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dynamic)
|
||||
|
|
|
@ -2653,12 +2653,6 @@ _bfd_elf_adjust_dynamic_symbol (struct elf_link_hash_entry *h, void *data)
|
|||
dynobj = elf_hash_table (eif->info)->dynobj;
|
||||
bed = get_elf_backend_data (dynobj);
|
||||
|
||||
if (h->type == STT_IFUNC
|
||||
&& (bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE))
|
||||
h->needs_plt = 1;
|
||||
|
||||
if (! (*bed->elf_backend_adjust_dynamic_symbol) (eif->info, h))
|
||||
{
|
||||
eif->failed = TRUE;
|
||||
|
@ -12407,71 +12401,3 @@ _bfd_elf_make_dynamic_reloc_section (asection * sec,
|
|||
|
||||
return reloc_sec;
|
||||
}
|
||||
|
||||
#define IFUNC_INFIX ".ifunc"
|
||||
|
||||
/* Returns the name of the ifunc-using-dynamic-reloc section associated with SEC. */
|
||||
|
||||
static const char *
|
||||
get_ifunc_reloc_section_name (bfd * abfd,
|
||||
asection * sec)
|
||||
{
|
||||
const char * dot;
|
||||
char * name;
|
||||
const char * base_name;
|
||||
unsigned int strndx = elf_elfheader (abfd)->e_shstrndx;
|
||||
unsigned int shnam = elf_section_data (sec)->rel_hdr.sh_name;
|
||||
|
||||
base_name = bfd_elf_string_from_elf_section (abfd, strndx, shnam);
|
||||
if (base_name == NULL)
|
||||
return NULL;
|
||||
|
||||
dot = strchr (base_name + 1, '.');
|
||||
name = bfd_alloc (abfd, strlen (base_name) + strlen (IFUNC_INFIX) + 1);
|
||||
sprintf (name, "%.*s%s%s", (int)(dot - base_name), base_name, IFUNC_INFIX, dot);
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
/* Like _bfd_elf_make_dynamic_reloc_section but it creates a
|
||||
section for holding relocs against symbols with the STT_IFUNC
|
||||
type. The section is attached to the OWNER bfd but it is created
|
||||
with a name based on SEC from ABFD. */
|
||||
|
||||
asection *
|
||||
_bfd_elf_make_ifunc_reloc_section (bfd * abfd,
|
||||
asection * sec,
|
||||
bfd * owner,
|
||||
unsigned int align)
|
||||
{
|
||||
asection * reloc_sec = elf_section_data (sec)->indirect_relocs;
|
||||
|
||||
if (reloc_sec == NULL)
|
||||
{
|
||||
const char * name = get_ifunc_reloc_section_name (abfd, sec);
|
||||
|
||||
if (name == NULL)
|
||||
return NULL;
|
||||
|
||||
reloc_sec = bfd_get_section_by_name (owner, name);
|
||||
|
||||
if (reloc_sec == NULL)
|
||||
{
|
||||
flagword flags;
|
||||
|
||||
flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_IN_MEMORY | SEC_LINKER_CREATED);
|
||||
if ((sec->flags & SEC_ALLOC) != 0)
|
||||
flags |= SEC_ALLOC | SEC_LOAD;
|
||||
|
||||
reloc_sec = bfd_make_section_with_flags (owner, name, flags);
|
||||
|
||||
if (reloc_sec != NULL
|
||||
&& ! bfd_set_section_alignment (owner, reloc_sec, align))
|
||||
reloc_sec = NULL;
|
||||
}
|
||||
|
||||
elf_section_data (sec)->indirect_relocs = reloc_sec;
|
||||
}
|
||||
|
||||
return reloc_sec;
|
||||
}
|
||||
|
|
11
bfd/syms.c
11
bfd/syms.c
|
@ -231,13 +231,6 @@ CODE_FRAGMENT
|
|||
. perhaps others someday. *}
|
||||
.#define BSF_FUNCTION (1 << 3)
|
||||
.
|
||||
. {* The symbol is an indirect code object. Unrelated to BSF_INDIRECT.
|
||||
. Relocations against a symbol with this flag have to evaluated at
|
||||
. run-time, where the function pointed to by this symbol is invoked
|
||||
. in order to determine the value to be used in the relocation.
|
||||
. BSF_FUNCTION must also be set for symbols with this flag. *}
|
||||
.#define BSF_INDIRECT_FUNCTION (1 << 4)
|
||||
.
|
||||
. {* Used by the linker. *}
|
||||
.#define BSF_KEEP (1 << 5)
|
||||
.#define BSF_KEEP_G (1 << 6)
|
||||
|
@ -490,7 +483,7 @@ bfd_print_symbol_vandf (bfd *abfd, void *arg, asymbol *symbol)
|
|||
(type & BSF_WEAK) ? 'w' : ' ',
|
||||
(type & BSF_CONSTRUCTOR) ? 'C' : ' ',
|
||||
(type & BSF_WARNING) ? 'W' : ' ',
|
||||
(type & BSF_INDIRECT) ? 'I' : (type & BSF_INDIRECT_FUNCTION) ? 'i' : ' ',
|
||||
(type & BSF_INDIRECT) ? 'I' : ' ',
|
||||
(type & BSF_DEBUGGING) ? 'd' : (type & BSF_DYNAMIC) ? 'D' : ' ',
|
||||
((type & BSF_FUNCTION)
|
||||
? 'F'
|
||||
|
@ -676,8 +669,6 @@ bfd_decode_symclass (asymbol *symbol)
|
|||
}
|
||||
if (bfd_is_ind_section (symbol->section))
|
||||
return 'I';
|
||||
if (symbol->flags & BSF_INDIRECT_FUNCTION)
|
||||
return 'i';
|
||||
if (symbol->flags & BSF_WEAK)
|
||||
{
|
||||
/* If weak, determine if it's specifically an object
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* objdump.c (dump_reloc_set): Remove STT_IFUNC support.
|
||||
* readelf.c (dump_relocations): Likewise.
|
||||
(get_symbol_type): Likewise.
|
||||
* doc/binutils.texi: Likewise.
|
||||
|
||||
2008-12-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||
|
||||
* configure: Regenerate.
|
||||
|
|
|
@ -729,10 +729,6 @@ The symbol is in an initialized data section for small objects. Some
|
|||
object file formats permit more efficient access to small data objects,
|
||||
such as a global int variable as opposed to a large global array.
|
||||
|
||||
@item I
|
||||
The symbol is an indirect reference to another symbol. This is a @sc{gnu}
|
||||
extension to the a.out object file format which is rarely used.
|
||||
|
||||
@item i
|
||||
The symbol is in a section specific to the implementation of DLLs.
|
||||
|
||||
|
|
|
@ -2722,8 +2722,6 @@ dump_reloc_set (bfd *abfd, asection *sec, arelent **relpp, long relcount)
|
|||
if (sym_name)
|
||||
{
|
||||
objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
|
||||
if ((*q->sym_ptr_ptr)->flags & BSF_INDIRECT_FUNCTION)
|
||||
printf ("() ");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -1251,38 +1251,9 @@ dump_relocations (FILE *file,
|
|||
|
||||
printf (" ");
|
||||
|
||||
if (ELF_ST_TYPE (psym->st_info) == STT_IFUNC)
|
||||
{
|
||||
const char * name;
|
||||
unsigned int len;
|
||||
unsigned int width = is_32bit_elf ? 8 : 14;
|
||||
print_vma (psym->st_value, LONG_HEX);
|
||||
|
||||
/* Relocations against IFUNC symbols do not use the value of
|
||||
the symbol as the address to relocate against. Instead
|
||||
they invoke the function named by the symbol and use its
|
||||
result as the address for relocation.
|
||||
|
||||
To indicate this to the user, do not display the value of
|
||||
the symbol in the "Symbols's Value" field. Instead show
|
||||
its name followed by () as a hint that the symbol is
|
||||
invoked. */
|
||||
|
||||
if (strtab == NULL
|
||||
|| psym->st_name == 0
|
||||
|| psym->st_name >= strtablen)
|
||||
name = "??";
|
||||
else
|
||||
name = strtab + psym->st_name;
|
||||
|
||||
len = print_symbol (width, name);
|
||||
printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
|
||||
}
|
||||
else
|
||||
{
|
||||
print_vma (psym->st_value, LONG_HEX);
|
||||
|
||||
printf (is_32bit_elf ? " " : " ");
|
||||
}
|
||||
printf (is_32bit_elf ? " " : " ");
|
||||
|
||||
if (psym->st_name == 0)
|
||||
{
|
||||
|
@ -7065,14 +7036,6 @@ get_symbol_type (unsigned int type)
|
|||
if (type == STT_HP_STUB)
|
||||
return "HP_STUB";
|
||||
}
|
||||
else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_LINUX
|
||||
|| elf_header.e_ident[EI_OSABI] == ELFOSABI_HURD
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE)
|
||||
{
|
||||
if (type == STT_IFUNC)
|
||||
return "IFUNC";
|
||||
}
|
||||
|
||||
snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* NEWS :Remove mention of STT_IFUNC support.
|
||||
* config/obj-elf.c (obj_elf_type): Remove STT_IFUNC support.
|
||||
* doc/as.texinfo: Remove mention of STT_IFUNC support.
|
||||
|
||||
2008-12-21 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* config/tc-cris.c (s_cris_dtpoff): New function.
|
||||
|
|
5
gas/NEWS
5
gas/NEWS
|
@ -1,10 +1,5 @@
|
|||
-*- text -*-
|
||||
|
||||
* The .type pseudo-op now accepts a type of STT_IFUNC which can be used to
|
||||
indicate that if the symbol is the target of a relocation, its value should
|
||||
not be used. Instead the function should be invoked and its result used as
|
||||
the value.
|
||||
|
||||
Changes in 2.19:
|
||||
|
||||
* New pseudo op .cfi_val_encoded_addr, to record constant addresses in unwind
|
||||
|
|
|
@ -1663,20 +1663,6 @@ obj_elf_type (int ignore ATTRIBUTE_UNUSED)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (typename, "indirect_function") == 0
|
||||
|| strcmp (typename, "10") == 0
|
||||
|| strcmp (typename, "STT_IFUNC") == 0)
|
||||
{
|
||||
const struct elf_backend_data *bed;
|
||||
|
||||
bed = get_elf_backend_data (stdoutput);
|
||||
if (!(bed->elf_osabi == ELFOSABI_LINUX
|
||||
/* GNU/Linux is still using the default value 0. */
|
||||
|| bed->elf_osabi == ELFOSABI_NONE))
|
||||
as_bad (_("symbol type \"%s\" is supported only by GNU targets"),
|
||||
typename);
|
||||
type = BSF_FUNCTION | BSF_INDIRECT_FUNCTION;
|
||||
}
|
||||
#ifdef md_elf_symbol_type
|
||||
else if ((type = md_elf_symbol_type (typename, sym, elfsym)) != -1)
|
||||
;
|
||||
|
|
|
@ -6293,14 +6293,6 @@ Mark the symbol as being a common data object.
|
|||
@itemx notype
|
||||
Does not mark the symbol in any way. It is supported just for completeness.
|
||||
|
||||
@item STT_IFUNC
|
||||
@itemx indirect_function
|
||||
Mark the symbol as an indirect function. This has the same semantics as
|
||||
STT_FUNC except when the symbol is referenced by a relocation. In this case
|
||||
the symbol's value is not used in the relocation but instead the symbol is
|
||||
invoked as a function taking no arguments and the return value is used in the
|
||||
relocation. This also means that processing of the relocation must be delayed
|
||||
until run-time. (This is only supported on some targets).
|
||||
@end table
|
||||
|
||||
Note: Some targets support extra types in addition to those listed above.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* gas/elf/type.s: Remove test of STT_IFUNC support.
|
||||
* gas/elf/type.e: Update expected output.
|
||||
|
||||
2008-12-21 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* gas/cris/rd-dtpoffd1.d, gas/cris/rd-dtpoffd1.s: New test.
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
.: 0+0 1 FUNC LOCAL DEFAULT . function
|
||||
.: 0+1 1 IFUNC LOCAL DEFAULT . indirect_function
|
||||
.: 0+0 1 OBJECT LOCAL DEFAULT . object
|
||||
.: 0+1 1 TLS LOCAL DEFAULT . tls_object
|
||||
.: 0+2 1 NOTYPE LOCAL DEFAULT . notype
|
||||
|
|
|
@ -2,10 +2,6 @@
|
|||
.size function,1
|
||||
.type function,%function
|
||||
function:
|
||||
.byte 0x0
|
||||
.size indirect_function,1
|
||||
.type indirect_function,%indirect_function
|
||||
indirect_function:
|
||||
.byte 0x0
|
||||
.data
|
||||
.type object,%object
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* commmon.h (STT_IFUNC): Delete.
|
||||
|
||||
2008-12-20 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* cris.h (R_CRIS_32_IE): New relocation.
|
||||
|
|
|
@ -546,7 +546,6 @@
|
|||
#define STT_RELC 8 /* Complex relocation expression */
|
||||
#define STT_SRELC 9 /* Signed Complex relocation expression */
|
||||
#define STT_LOOS 10 /* OS-specific semantics */
|
||||
#define STT_IFUNC 10 /* Symbol is an indirect code object */
|
||||
#define STT_HIOS 12 /* OS-specific semantics */
|
||||
#define STT_LOPROC 13 /* Application-specific semantics */
|
||||
#define STT_HIPROC 15 /* Application-specific semantics */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* NEWS: Remove mention of support for STT_IFUNC.
|
||||
|
||||
2008-12-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||
|
||||
* configure: Regenerate.
|
||||
|
|
4
ld/NEWS
4
ld/NEWS
|
@ -1,8 +1,4 @@
|
|||
-*- text -*-
|
||||
* For GNU/Linux systems the linker will now forego processing any relocations
|
||||
made against symbols of the STT_IFUNC type and instead emit them into
|
||||
the resulting binary for processing by the loader.
|
||||
|
||||
* Add CR16 ELF --embedded-relocs (used to embedded relocations into binaries
|
||||
for Embedded-PIC code) option.
|
||||
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2008-12-23 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* ld-i386/i386.exp: Do not run ifunc test.
|
||||
* ld-i386/ifunc.s: Delete.
|
||||
* ld-i386/ifunc.d: Delete.
|
||||
* ld-x86-64/x86-64.exp: Do not run ifunc test.
|
||||
* ld-x86-64/ifunc.s: Delete.
|
||||
* ld-x86-64/ifunc.d: Delete.
|
||||
|
||||
2008-12-20 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
* ld-cris/tls-err-77.d, ld-cris/tls-gc-79.d, ld-cris/tls-ie-8e.s,
|
||||
|
|
|
@ -138,4 +138,3 @@ run_dump_test "hidden3"
|
|||
run_dump_test "protected1"
|
||||
run_dump_test "protected2"
|
||||
run_dump_test "protected3"
|
||||
run_dump_test "ifunc"
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
#name: Generation of dynamic relocs for STT_IFUNC symbols
|
||||
#source: ifunc.s
|
||||
#as: --32
|
||||
#ld: -melf_i386 -lc --defsym _start=0 -L/usr/lib
|
||||
#readelf: --relocs --syms
|
||||
|
||||
Relocation section '.rel.ifunc.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
|
||||
+Offset +Info +Type +Sym.Value +Sym. Name
|
||||
[0-9a-f]+ 0+0202 R_386_PC32 func\(\) func
|
||||
[0-9a-f]+ 0+0102 R_386_PC32 long_fun\(\) long_func_name
|
||||
#...
|
||||
..: [0-9a-f]+ .. IFUNC GLOBAL DEFAULT .. long_func_name
|
||||
..: [0-9a-f]+ .. IFUNC GLOBAL DEFAULT .. func
|
||||
#pass
|
|
@ -1,128 +0,0 @@
|
|||
.file "ifunc.c"
|
||||
#APP
|
||||
.type func, %indirect_function
|
||||
.type long_func_name, %indirect_function
|
||||
.section .rodata.str1.1,"aMS",@progbits,1
|
||||
.LC0:
|
||||
.string "arg is %d\n"
|
||||
#NO_APP
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl bar
|
||||
.type bar, @function
|
||||
bar:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
subl $8, %esp
|
||||
movl 8(%ebp), %eax
|
||||
movl $.LC0, (%esp)
|
||||
movl %eax, 4(%esp)
|
||||
call printf
|
||||
leave
|
||||
ret
|
||||
.size bar, .-bar
|
||||
.section .rodata.str1.1
|
||||
.LC1:
|
||||
.string "main: calling func"
|
||||
.section .rodata.str1.4,"aMS",@progbits,1
|
||||
.align 4
|
||||
.LC2:
|
||||
.string "main: func finished, calling long_func_name"
|
||||
.section .rodata.str1.1
|
||||
.LC3:
|
||||
.string "main: long_func_name finished"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
leal 4(%esp), %ecx
|
||||
andl $-16, %esp
|
||||
pushl -4(%ecx)
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
pushl %ecx
|
||||
subl $4, %esp
|
||||
movl $.LC1, (%esp)
|
||||
call puts
|
||||
call func
|
||||
movl $.LC2, (%esp)
|
||||
call puts
|
||||
call long_func_name
|
||||
movl $.LC3, (%esp)
|
||||
call puts
|
||||
addl $4, %esp
|
||||
xorl %eax, %eax
|
||||
popl %ecx
|
||||
popl %ebp
|
||||
leal -4(%ecx), %esp
|
||||
ret
|
||||
.size main, .-main
|
||||
.p2align 4,,15
|
||||
.globl long_func_name
|
||||
.type long_func_name, @function
|
||||
long_func_name:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
subl $8, %esp
|
||||
call rand
|
||||
movl $func0, %edx
|
||||
testl %eax, %eax
|
||||
jne .L7
|
||||
movl $func1, %edx
|
||||
.L7:
|
||||
movl %edx, %eax
|
||||
leave
|
||||
ret
|
||||
.size long_func_name, .-long_func_name
|
||||
.p2align 4,,15
|
||||
.globl func
|
||||
.type func, @function
|
||||
func:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
subl $8, %esp
|
||||
call rand
|
||||
movl $func0, %edx
|
||||
testl %eax, %eax
|
||||
jne .L12
|
||||
movl $func1, %edx
|
||||
.L12:
|
||||
movl %edx, %eax
|
||||
leave
|
||||
ret
|
||||
.size func, .-func
|
||||
.section .rodata.str1.1
|
||||
.LC4:
|
||||
.string "func1\n"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl func1
|
||||
.type func1, @function
|
||||
func1:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
subl $8, %esp
|
||||
movl $.LC4, (%esp)
|
||||
call puts
|
||||
leave
|
||||
ret
|
||||
.size func1, .-func1
|
||||
.section .rodata.str1.1
|
||||
.LC5:
|
||||
.string "func0\n"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl func0
|
||||
.type func0, @function
|
||||
func0:
|
||||
pushl %ebp
|
||||
movl %esp, %ebp
|
||||
subl $8, %esp
|
||||
movl $.LC5, (%esp)
|
||||
call puts
|
||||
leave
|
||||
ret
|
||||
.size func0, .-func0
|
||||
.ident "GCC: (GNU) 4.3.0 20080428 (Red Hat 4.3.0-8)"
|
||||
.section .note.GNU-stack,"",@progbits
|
|
@ -1,14 +0,0 @@
|
|||
#name: Generation of dynamic relocs for STT_IFUNC symbols
|
||||
#source: ifunc.s
|
||||
#ld: --defsym _start=0 --defsym puts=0 --defsym rand=0 --defsym printf=0
|
||||
#readelf: --relocs --syms
|
||||
|
||||
Relocation section '.rela.ifunc.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
|
||||
+Offset +Info +Type +Sym. Value +Sym. Name \+ Addend
|
||||
[0-9a-f]+ 0+20+2 R_X86_64_PC32 .*
|
||||
[0-9a-f]+ 0+10+2 R_X86_64_PC32 .*
|
||||
#...
|
||||
..: [0-9a-f]+ .. IFUNC GLOBAL DEFAULT .. long_func_name
|
||||
#...
|
||||
..: [0-9a-f]+ .. IFUNC GLOBAL DEFAULT .. func
|
||||
#pass
|
|
@ -1,198 +0,0 @@
|
|||
.file "ifunc.c"
|
||||
#APP
|
||||
.type func, %indirect_function
|
||||
.type long_func_name, %indirect_function
|
||||
.section .rodata.str1.1,"aMS",@progbits,1
|
||||
.LC0:
|
||||
.string "arg is %d\n"
|
||||
#NO_APP
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl bar
|
||||
.type bar, @function
|
||||
bar:
|
||||
.LFB25:
|
||||
movl %edi, %esi
|
||||
xorl %eax, %eax
|
||||
movl $.LC0, %edi
|
||||
jmp printf
|
||||
.LFE25:
|
||||
.size bar, .-bar
|
||||
.section .rodata.str1.1
|
||||
.LC1:
|
||||
.string "main: calling func"
|
||||
.section .rodata.str1.8,"aMS",@progbits,1
|
||||
.align 8
|
||||
.LC2:
|
||||
.string "main: func finished, calling long_func_name"
|
||||
.section .rodata.str1.1
|
||||
.LC3:
|
||||
.string "main: long_func_name finished"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl main
|
||||
.type main, @function
|
||||
main:
|
||||
.LFB24:
|
||||
subq $8, %rsp
|
||||
.LCFI0:
|
||||
movl $.LC1, %edi
|
||||
call puts
|
||||
call func
|
||||
movl $.LC2, %edi
|
||||
call puts
|
||||
call long_func_name
|
||||
movl $.LC3, %edi
|
||||
call puts
|
||||
xorl %eax, %eax
|
||||
addq $8, %rsp
|
||||
ret
|
||||
.LFE24:
|
||||
.size main, .-main
|
||||
.p2align 4,,15
|
||||
.globl long_func_name
|
||||
.type long_func_name, @function
|
||||
long_func_name:
|
||||
.LFB23:
|
||||
subq $8, %rsp
|
||||
.LCFI1:
|
||||
call rand
|
||||
movl %eax, %edx
|
||||
movl $func1, %eax
|
||||
testl %edx, %edx
|
||||
movl $func0, %edx
|
||||
cmovne %rdx, %rax
|
||||
addq $8, %rsp
|
||||
ret
|
||||
.LFE23:
|
||||
.size long_func_name, .-long_func_name
|
||||
.p2align 4,,15
|
||||
.globl func
|
||||
.type func, @function
|
||||
func:
|
||||
.LFB22:
|
||||
subq $8, %rsp
|
||||
.LCFI2:
|
||||
call rand
|
||||
movl %eax, %edx
|
||||
movl $func1, %eax
|
||||
testl %edx, %edx
|
||||
movl $func0, %edx
|
||||
cmovne %rdx, %rax
|
||||
addq $8, %rsp
|
||||
ret
|
||||
.LFE22:
|
||||
.size func, .-func
|
||||
.section .rodata.str1.1
|
||||
.LC4:
|
||||
.string "func1\n"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl func1
|
||||
.type func1, @function
|
||||
func1:
|
||||
.LFB21:
|
||||
movl $.LC4, %edi
|
||||
jmp puts
|
||||
.LFE21:
|
||||
.size func1, .-func1
|
||||
.section .rodata.str1.1
|
||||
.LC5:
|
||||
.string "func0\n"
|
||||
.text
|
||||
.p2align 4,,15
|
||||
.globl func0
|
||||
.type func0, @function
|
||||
func0:
|
||||
.LFB20:
|
||||
movl $.LC5, %edi
|
||||
jmp puts
|
||||
.LFE20:
|
||||
.size func0, .-func0
|
||||
.section .eh_frame,"a",@progbits
|
||||
.Lframe1:
|
||||
.long .LECIE1-.LSCIE1
|
||||
.LSCIE1:
|
||||
.long 0x0
|
||||
.byte 0x1
|
||||
.string "zR"
|
||||
.uleb128 0x1
|
||||
.sleb128 -8
|
||||
.byte 0x10
|
||||
.uleb128 0x1
|
||||
.byte 0x3
|
||||
.byte 0xc
|
||||
.uleb128 0x7
|
||||
.uleb128 0x8
|
||||
.byte 0x90
|
||||
.uleb128 0x1
|
||||
.align 8
|
||||
.LECIE1:
|
||||
.LSFDE1:
|
||||
.long .LEFDE1-.LASFDE1
|
||||
.LASFDE1:
|
||||
.long .LASFDE1-.Lframe1
|
||||
.long .LFB25
|
||||
.long .LFE25-.LFB25
|
||||
.uleb128 0x0
|
||||
.align 8
|
||||
.LEFDE1:
|
||||
.LSFDE3:
|
||||
.long .LEFDE3-.LASFDE3
|
||||
.LASFDE3:
|
||||
.long .LASFDE3-.Lframe1
|
||||
.long .LFB24
|
||||
.long .LFE24-.LFB24
|
||||
.uleb128 0x0
|
||||
.byte 0x4
|
||||
.long .LCFI0-.LFB24
|
||||
.byte 0xe
|
||||
.uleb128 0x10
|
||||
.align 8
|
||||
.LEFDE3:
|
||||
.LSFDE5:
|
||||
.long .LEFDE5-.LASFDE5
|
||||
.LASFDE5:
|
||||
.long .LASFDE5-.Lframe1
|
||||
.long .LFB23
|
||||
.long .LFE23-.LFB23
|
||||
.uleb128 0x0
|
||||
.byte 0x4
|
||||
.long .LCFI1-.LFB23
|
||||
.byte 0xe
|
||||
.uleb128 0x10
|
||||
.align 8
|
||||
.LEFDE5:
|
||||
.LSFDE7:
|
||||
.long .LEFDE7-.LASFDE7
|
||||
.LASFDE7:
|
||||
.long .LASFDE7-.Lframe1
|
||||
.long .LFB22
|
||||
.long .LFE22-.LFB22
|
||||
.uleb128 0x0
|
||||
.byte 0x4
|
||||
.long .LCFI2-.LFB22
|
||||
.byte 0xe
|
||||
.uleb128 0x10
|
||||
.align 8
|
||||
.LEFDE7:
|
||||
.LSFDE9:
|
||||
.long .LEFDE9-.LASFDE9
|
||||
.LASFDE9:
|
||||
.long .LASFDE9-.Lframe1
|
||||
.long .LFB21
|
||||
.long .LFE21-.LFB21
|
||||
.uleb128 0x0
|
||||
.align 8
|
||||
.LEFDE9:
|
||||
.LSFDE11:
|
||||
.long .LEFDE11-.LASFDE11
|
||||
.LASFDE11:
|
||||
.long .LASFDE11-.Lframe1
|
||||
.long .LFB20
|
||||
.long .LFE20-.LFB20
|
||||
.uleb128 0x0
|
||||
.align 8
|
||||
.LEFDE11:
|
||||
.ident "GCC: (GNU) 4.3.0 20080428 (Red Hat 4.3.0-8)"
|
||||
.section .note.GNU-stack,"",@progbits
|
|
@ -92,4 +92,4 @@ run_dump_test "hidden3"
|
|||
run_dump_test "protected1"
|
||||
run_dump_test "protected2"
|
||||
run_dump_test "protected3"
|
||||
run_dump_test "ifunc"
|
||||
|
||||
|
|
Loading…
Reference in New Issue