Bug 14166 - invalid IFUNC DW_AT_linkage_name: memmove strstr time
Summary: invalid IFUNC DW_AT_linkage_name: memmove strstr time
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: libc (show other bugs)
Version: 2.15
: P2 normal
Target Milestone: ---
Assignee: H.J. Lu
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-05-24 19:56 UTC by Jan Kratochvil
Modified: 2014-06-19 14:37 UTC (History)
3 users (show)

See Also:
Host: x86_64-unknown-linux-gnu
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
Broken fix attempt. (647 bytes, patch)
2012-05-24 19:56 UTC, Jan Kratochvil
Details | Diff
A patch (1.18 KB, patch)
2012-08-08 17:52 UTC, H.J. Lu
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jan Kratochvil 2012-05-24 19:56:27 UTC
Created attachment 6422 [details]
Broken fix attempt.

$ ./gdb /lib64/libc.so.6
GNU gdb (GDB) 7.4.50.20120523-cvs
(gdb) p memmove
$1 = {<text gnu-indirect-function variable, no debug info>} 0x88a70 <memmove>
(gdb) p memmove
$2 = {void *(void)} 0x88a70 <memmove>

DWARF has no way how to mark a function as IFUNC.  Only ELF has a way.
No DWARF DIE definition must use ELF IFUNC symbol names as GDB prefers DWARF symbols more than ELF symbols.

These DWARF DW_AT_linkage_name symbols are marked in ELF as IFUNC:
  __GI___strcasecmp __GI_time __gettimeofday __memmove_chk __sched_cpucount
  __strcasestr memmove strstr time

Out of those only these are of concern to users:
  memmove strstr time

 <0><18c0c5>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <18c0cb>   DW_AT_name        : ../sysdeps/x86_64/multiarch/memmove.c
 <1><18c3f8>: Abbrev Number: 27 (DW_TAG_subprogram)
    <18c3f9>   DW_AT_external    : 1
    <18c3f9>   DW_AT_name        : memmove_ifunc
    <18c3fd>   DW_AT_decl_file   : 2
    <18c3fe>   DW_AT_decl_line   : 46
    <18c3ff>   DW_AT_linkage_name: memmove
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    <18c403>   DW_AT_prototyped  : 1
    <18c403>   DW_AT_type        : <0x18c126>
    <18c407>   DW_AT_low_pc      : 0x88a70
    <18c40f>   DW_AT_high_pc     : 0x88ab7
    <18c417>   DW_AT_frame_base  : 1 byte block: 9c     (DW_OP_call_frame_cfa)
    <18c419>   DW_AT_GNU_all_call_sites: 1
    <18c419>   DW_AT_sibling     : <0x18c43a>

libc_ifunc (memmove,
            ^^^^^^^
Other uses of libc_ifunc are for example:
libc_ifunc (__strcasestr,

Attached broken fix attempt fails to build:
../sysdeps/x86_64/multiarch/memmove.c: In function '__memmove_ifunc':
../sysdeps/x86_64/multiarch/memmove.c:42:1: error: '__memmove' undeclared (first use in this function)
Comment 1 H.J. Lu 2012-08-08 15:53:22 UTC
What should debug info look like? How will debug info be used by GDB?
Comment 2 Jan Kratochvil 2012-08-08 16:09:35 UTC
There should be no DWARF for memmove.
GDB should see just the ELF symbol (which is IFUNC).

There can be some DWARF for memmove but if it is it must have different name, such as __GI_memmove or whatever.
Comment 3 H.J. Lu 2012-08-08 17:52:14 UTC
Created attachment 6569 [details]
A patch

Please try this and let me know if it fixes your problem.
Comment 4 Jan Kratochvil 2012-08-08 21:55:06 UTC
It looks perfect during all the tests I made, thanks!

The Fedora GDB workaround is no longer needed:
http://pkgs.fedoraproject.org/cgit/gdb.git/tree/gdb-glibc-strstr-workaround.patch
Comment 5 Jan Kratochvil 2012-08-10 06:01:04 UTC
commit f85fa27058eb7d4b56b8deaf885064cf8d730f68
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Thu Aug 9 16:04:37 2012 -0700

    Avoid DWARF definition DIE on ifunc symbols