+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.
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)
/* 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;
(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
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)
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)
/* 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);
}
filename = bfd_asymbol_name (&q->symbol);
break;
case STT_FUNC:
- case STT_IFUNC:
case STT_ARM_TFUNC:
case STT_NOTYPE:
/* Skip mapping symbols. */
/* 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
/* 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);
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. */
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. */
&& (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;
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)
}
}
}
- 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
{
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);
&& ((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;
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);
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;
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. */
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)
&& (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;
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)
}
}
}
- 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
{
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);
&& ((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;
}
}
- 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);
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;
}
case STT_SRELC:
sym->symbol.flags |= BSF_SRELC;
break;
- case STT_IFUNC:
- sym->symbol.flags |= BSF_INDIRECT_FUNCTION;
- break;
}
if (dynamic)
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;
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;
-}
. 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)
(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'
}
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
+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.
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.
if (sym_name)
{
objdump_print_symname (abfd, NULL, *q->sym_ptr_ptr);
- if ((*q->sym_ptr_ptr)->flags & BSF_INDIRECT_FUNCTION)
- printf ("() ");
}
else
{
printf (" ");
- if (ELF_ST_TYPE (psym->st_info) == STT_IFUNC)
- {
- const char * name;
- unsigned int len;
- unsigned int width = is_32bit_elf ? 8 : 14;
-
- /* 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);
+ print_vma (psym->st_value, LONG_HEX);
- printf (is_32bit_elf ? " " : " ");
- }
+ printf (is_32bit_elf ? " " : " ");
if (psym->st_name == 0)
{
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);
}
+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.
-*- 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
}
}
}
- 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)
;
@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.
+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.
.: 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
.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
+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.
#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 */
+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.
-*- 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.
+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,
run_dump_test "protected1"
run_dump_test "protected2"
run_dump_test "protected3"
-run_dump_test "ifunc"
+++ /dev/null
-#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
+++ /dev/null
- .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
+++ /dev/null
-#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
+++ /dev/null
- .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
run_dump_test "protected1"
run_dump_test "protected2"
run_dump_test "protected3"
-run_dump_test "ifunc"
+