13 жовтнÑ? 2006 о 15:28 -0700 Stone, Joshua I напиÑ?ав(-ла):
This seems to support the notion that the linker elided that function.
So, as Eugeniy wondered, why did the translator pick up that function at
all? I'm also curious what IP it chose for the kprobe, if the function
no longer exists... Please try this command:
$ stap -p2 -vv -e 'probe kernel.function("exit_pfm_fs"){}' 2>&1 | grep
'pc='
I suspect that either elfutils is giving 'stale' debug information, or
the translator is misinterpreting its results.
It loks like a bug in some version of gcc. I tried to compile the
following program with version from Debian stable and unstable on ia64:
$ cat test.c
static void __attribute__((section(".exit.text"))) exit_pfm_fs(void)
{
return;
}
$
With gcc 3.3.5:
$ readelf -a test.o | grep exit_
9: 0000000000000000 16 FUNC LOCAL DEFAULT 9 exit_pfm_fs
$ objdump -W test.o
...
The section .debug_info contains:
Compilation Unit @ offset 0x0:
Length: 52
Version: 2
Abbrev Offset: 0
Pointer Size: 8
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
DW_AT_stmt_list : 0
DW_AT_name : (indirect string, offset: 0x38): test.c
DW_AT_comp_dir : (indirect string, offset: 0x0): /home/eugen
DW_AT_producer : (indirect string, offset: 0xc): GNU C 3.3.5
(Debian 1:3.3.5-13)
DW_AT_language : 1 (ANSI C)
<1><1d>: Abbrev Number: 2 (DW_TAG_subprogram)
DW_AT_name : (indirect string, offset: 0x2c): exit_pfm_fs
DW_AT_decl_file : 1
DW_AT_decl_line : 2
DW_AT_prototyped : 1
DW_AT_low_pc : 0
DW_AT_high_pc : 0x10
DW_AT_frame_base : 1 byte block: 5c (DW_OP_reg12)
...
$
With gcc 4.1.2:
$ readelf -a t.o | grep exit_
$ objdump -W t.o | grep exit_
objdump: Error: No comp units in .debug_info section ?objdump: Error: No
comp units in .debug_info section ?$