Bug 24892 - [-fPIE/-pie] FAIL: gdb.arch/amd64-entry-value-param.exp: call 1: p y
Summary: [-fPIE/-pie] FAIL: gdb.arch/amd64-entry-value-param.exp: call 1: p y
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: symtab (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: 12.1
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-08-08 14:33 UTC by Tom de Vries
Modified: 2021-10-05 09:43 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
Tentative patch (1.17 KB, patch)
2019-08-09 06:28 UTC, Tom de Vries
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2019-08-08 14:33:52 UTC
With target board unix/-fPIE/-pie and gdb.arch/amd64-entry-value-param.exp, we get:
...
FAIL: gdb.arch/amd64-entry-value-param.exp: call 1: p y
FAIL: gdb.arch/amd64-entry-value-param.exp: call 1: p b
FAIL: gdb.arch/amd64-entry-value-param.exp: call 2: p y
FAIL: gdb.arch/amd64-entry-value-param.exp: call 2: p b
FAIL: gdb.arch/amd64-entry-value-param.exp: call 3: p y
FAIL: gdb.arch/amd64-entry-value-param.exp: call 3: p b
...

Reproduce first FAIL on command line:
...
$ gdb ./build/gdb/testsuite/outputs/gdb.arch/amd64-entry-value-param/amd64-entry-value-param -batch -ex "b foo" -ex run -ex "p y"
Breakpoint 1 at 0x650: file gdb.arch/amd64-entry-value-param.c, line 26.

Breakpoint 1, foo (x=10, y=<optimized out>, z=3) at gdb.arch/amd64-entry-value-param.c:26
26      gdb.arch/amd64-entry-value-param.c: Bestand of map bestaat niet.
$1 = <optimized out>
...

as opposed to this without -fPIE/-pie:
...
$ gdb ./build/gdb/testsuite/outputs/gdb.arch/amd64-entry-value-param/amd64-entry-value-param -batch -ex "b foo" -ex run -ex "p y"
Breakpoint 1 at 0x4004c0: file gdb.arch/amd64-entry-value-param.c, line 26.

Breakpoint 1, foo (x=x@entry=10, y=2, z=3) at gdb.arch/amd64-entry-value-param.c:26
26      gdb.arch/amd64-entry-value-param.c: Bestand of map bestaat niet.
$1 = 2
...
Comment 1 Tom de Vries 2019-08-08 15:01:42 UTC
Setting a breakpoint on throw_error, we get:
...
Thread 1 "gdb" hit Breakpoint 2, throw_error (error=NO_ENTRY_VALUE_ERROR, 
    fmt=0xb57318 "DW_OP_entry_value resolving cannot find DW_TAG_call_site %s in %s")
    at src/gdb/gdbsupport/common-exceptions.c:222
222       va_start (args, fmt);
(gdb) bt
#0  throw_error (error=NO_ENTRY_VALUE_ERROR, 
    fmt=0xb57318 "DW_OP_entry_value resolving cannot find DW_TAG_call_site %s in %s")
    at src/gdb/gdbsupport/common-exceptions.c:222
#1  0x0000000000479158 in call_site_for_pc (gdbarch=0x1a9a730, pc=93824992233083)
    at src/gdb/block.c:237
#2  0x000000000059b023 in call_site_find_chain_1 (gdbarch=0x1a9a730, caller_pc=93824992233083, 
    callee_pc=93824992233040) at src/gdb/dwarf2loc.c:1097
#3  0x000000000059b3fc in call_site_find_chain (gdbarch=0x1a9a730, caller_pc=93824992233083, 
    callee_pc=93824992233040) at src/gdb/dwarf2loc.c:1201
#4  0x000000000058c41e in dwarf2_tailcall_sniffer_first (this_frame=0x1a4db00, tailcall_cachep=0x1a4dc08, 
    entry_cfa_sp_offsetp=0x0) at src/gdb/dwarf2-frame-tailcall.c:391
#5  0x000000000058f3f8 in dwarf2_frame_prev_register (this_frame=0x1a4db00, this_cache=0x1a4db18, regnum=16)
    at src/gdb/dwarf2-frame.c:1236
#6  0x0000000000629105 in frame_unwind_register_value (next_frame=0x1a4db00, regnum=16)
    at src/gdb/frame.c:1229
#7  0x0000000000628ca4 in frame_register_unwind (next_frame=0x1a4db00, regnum=16, optimizedp=0x7fffffffc5bc, 
    unavailablep=0x7fffffffc5b8, lvalp=0x7fffffffc5a8, addrp=0x7fffffffc5b0, realnump=0x7fffffffc5ac, 
    bufferp=0x7fffffffc5e8 "") at src/gdb/frame.c:1132
#8  0x0000000000628f95 in frame_unwind_register (next_frame=0x1a4db00, regnum=16, buf=0x7fffffffc5e8 "")
    at src/gdb/frame.c:1188
#9  0x000000000069a36e in i386_unwind_pc (gdbarch=0x1a9a730, next_frame=0x1a4db00)
    at src/gdb/i386-tdep.c:1967
#10 0x000000000063bf53 in gdbarch_unwind_pc (gdbarch=0x1a9a730, next_frame=0x1a4db00)
    at src/gdb/gdbarch.c:3085
#11 0x0000000000628616 in frame_unwind_pc (this_frame=0x1a4db00) at src/gdb/frame.c:928
#12 0x000000000062b536 in get_frame_pc (frame=0x1b8ef80) at src/gdb/frame.c:2399
#13 0x000000000062b614 in get_frame_address_in_block (this_frame=0x1b8ef80)
    at src/gdb/frame.c:2429
#14 0x00000000006d8352 in inline_frame_sniffer (self=0xbe83e0 <inline_frame_unwind>, this_frame=0x1b8ef80, 
    this_cache=0x1b8ef98) at src/gdb/inline-frame.c:204
#15 0x0000000000626491 in frame_unwind_try_unwinder (this_frame=0x1b8ef80, this_cache=0x1b8ef98, 
    unwinder=0xbe83e0 <inline_frame_unwind>) at src/gdb/frame-unwind.c:107
#16 0x00000000006265fe in frame_unwind_find_by_frame (this_frame=0x1b8ef80, this_cache=0x1b8ef98)
    at src/gdb/frame-unwind.c:165
#17 0x0000000000627a57 in compute_frame_id (fi=0x1b8ef80) at src/gdb/frame.c:546
#18 0x000000000062a777 in get_prev_frame_if_no_cycle (this_frame=0x1a4db00)
    at src/gdb/frame.c:1927
#19 0x000000000062ae87 in get_prev_frame_always_1 (this_frame=0x1a4db00)
    at src/gdb/frame.c:2108
#20 0x000000000062aeaf in get_prev_frame_always (this_frame=0x1a4db00)
    at src/gdb/frame.c:2124
#21 0x000000000062b43a in get_prev_frame (this_frame=0x1a4db00) at src/gdb/frame.c:2376
#22 0x000000000059bbb4 in value_of_dwarf_reg_entry (type=0x1a164e0, frame=0x1a4db00, 
    kind=CALL_SITE_PARAMETER_DWARF_REG, kind_u=...) at src/gdb/dwarf2loc.c:1449
#23 0x000000000059bd5f in value_of_dwarf_block_entry (type=0x1a164e0, frame=0x1a4db00, block=0x1a30085 "U\aK", 
    block_len=1) at src/gdb/dwarf2loc.c:1501
#24 0x000000000059ffff in locexpr_read_variable_at_entry (symbol=0x1a64610, frame=0x1a4db00)
    at src/gdb/dwarf2loc.c:3543
#25 0x0000000000866ad8 in read_frame_arg (fp_opts=..., sym=0x1a64610, frame=0x1a4db00, argp=0x7fffffffcb80, 
    entryargp=0x7fffffffcba0) at src/gdb/stack.c:496
#26 0x00000000008675b7 in print_frame_args (fp_opts=..., func=0x1a645a0, frame=0x1a4db00, num=-1, 
    stream=0x1a6e070) at src/gdb/stack.c:818
#27 0x000000000086873e in print_frame (fp_opts=..., frame=0x1a4db00, print_level=0, print_what=SRC_AND_LOC, 
    print_args=1, sal=...) at src/gdb/stack.c:1332
#28 0x0000000000867d54 in print_frame_info (fp_opts=..., frame=0x1a4db00, print_level=0, print_what=SRC_AND_LOC, 
    print_args=1, set_current_sal=1) at src/gdb/stack.c:1031
#29 0x00000000008662d6 in print_stack_frame (frame=0x1a4db00, print_level=0, print_what=SRC_AND_LOC, 
    set_current_sal=1) at src/gdb/stack.c:305
#30 0x00000000006d1423 in print_stop_location (ws=0x7fffffffd020)
    at src/gdb/infrun.c:7809
#31 0x00000000006d148a in print_stop_event (uiout=0x1a18a00, displays=true)
    at src/gdb/infrun.c:7826
#32 0x00000000008fae0f in tui_on_normal_stop (bs=0x1ab9fe0, print_frame=1)
    at src/gdb/tui/tui-interp.c:99
#33 0x0000000000445d3a in std::_Function_handler<void (bpstats*, int), void (*)(bpstats*, int)>::_M_invoke(std::_Any_data const&, bpstats*&&, int&&) (__functor=..., __args#0=@0x7fffffffd140: 0x1ab9fe0, 
    __args#1=@0x7fffffffd13c: 1) at /usr/include/c++/8/bits/std_function.h:297
#34 0x00000000006d5a14 in std::function<void (bpstats*, int)>::operator()(bpstats*, int) const (this=0x131b220, 
    __args#0=0x1ab9fe0, __args#1=1) at /usr/include/c++/8/bits/std_function.h:687
#35 0x00000000006d51be in gdb::observers::observable<bpstats*, int>::notify (
    this=0x11f72a0 <gdb::observers::normal_stop>, args#0=0x1ab9fe0, args#1=1)
    at src/gdb/gdbsupport/observable.h:106
#36 0x00000000006d1b5e in normal_stop () at src/gdb/infrun.c:8098
#37 0x00000000006c8b87 in fetch_inferior_event (client_data=0x0)
    at src/gdb/infrun.c:3781
#38 0x00000000006b087b in inferior_event_handler (event_type=INF_REG_EVENT, client_data=0x0)
    at src/gdb/inf-loop.c:43
#39 0x000000000070223c in handle_target_event (error=0, client_data=0x0)
    at src/gdb/linux-nat.c:4352
#40 0x000000000060de3d in handle_file_event (file_ptr=0x1a5b670, ready_mask=1)
    at src/gdb/event-loop.c:731
#41 0x000000000060e3e0 in gdb_wait_for_event (block=0) at src/gdb/event-loop.c:857
#42 0x000000000060d2b1 in gdb_do_one_event () at src/gdb/event-loop.c:321
#43 0x00000000008d7cbb in wait_sync_command_done () at src/gdb/top.c:510
#44 0x00000000008d7d33 in maybe_wait_sync_command_done (was_sync=0) at src/gdb/top.c:527
#45 0x00000000008d8144 in execute_command (p=0x7fffffffe134 "", from_tty=0)
    at src/gdb/top.c:629
#46 0x0000000000726e66 in catch_command_errors (command=0x8d7d4c <execute_command(char const*, int)>, 
    arg=0x7fffffffe131 "run", from_tty=0) at src/gdb/main.c:372
#47 0x0000000000728065 in captured_main_1 (context=0x7fffffffda70)
    at src/gdb/main.c:1136
#48 0x00000000007281a5 in captured_main (data=0x7fffffffda70) at src/gdb/main.c:1161
#49 0x0000000000728210 in gdb_main (args=0x7fffffffda70) at src/gdb/main.c:1186
#50 0x00000000004123f9 in main (argc=13, argv=0x7fffffffdb78) at src/gdb/gdb.c:32
...
Comment 2 Tom de Vries 2019-08-08 15:06:35 UTC
Hmm, AFAIU, we call read_call_site_scope and try to update the pc to have the relocated value:
...
  baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
  ...
  pc = attr_value_as_address (attr) + baseaddr;
  pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc);
...
but unfortunately, objfile_relocate1 has not been called yet, so baseaddr is 0.
Comment 3 Tom de Vries 2019-08-09 06:28:41 UTC
Created attachment 11943 [details]
Tentative patch

This patch makes the test-case pass with -fPIE/-pie.