1 /* Copyright (C) 2020-2024 Free Software Foundation, Inc. 2 3 This file is part of GDB. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18 #include "target.h" 19 #include "netbsd-low.h" 20 #include "nat/netbsd-nat.h" 21 22 #include <sys/param.h> 23 #include <sys/types.h> 24 25 #include <sys/ptrace.h> 26 #include <sys/sysctl.h> 27 28 #include <limits.h> 29 #include <unistd.h> 30 #include <signal.h> 31 32 #include <elf.h> 33 34 #include <type_traits> 35 36 #include "gdbsupport/eintr.h" 37 #include "gdbsupport/gdb_wait.h" 38 #include "gdbsupport/filestuff.h" 39 #include "gdbsupport/common-inferior.h" 40 #include "nat/fork-inferior.h" 41 #include "hostio.h" 42 43 int using_threads = 1; 44 45 /* Callback used by fork_inferior to start tracing the inferior. */ 46 47 static void 48 netbsd_ptrace_fun () 49 { 50 /* Switch child to its own process group so that signals won't 51 directly affect GDBserver. */ 52 if (setpgid (0, 0) < 0) 53 trace_start_error_with_name (("setpgid")); 54 55 if (ptrace (PT_TRACE_ME, 0, nullptr, 0) < 0) 56 trace_start_error_with_name (("ptrace")); 57 58 /* If GDBserver is connected to gdb via stdio, redirect the inferior's 59 stdout to stderr so that inferior i/o doesn't corrupt the connection. 60 Also, redirect stdin to /dev/null. */ 61 if (remote_connection_is_stdio ()) 62 { 63 if (close (0) < 0) 64 trace_start_error_with_name (("close")); 65 if (open ("/dev/null", O_RDONLY) < 0) 66 trace_start_error_with_name (("open")); 67 if (dup2 (2, 1) < 0) 68 trace_start_error_with_name (("dup2")); 69 if (write (2, "stdin/stdout redirected\n", 70 sizeof ("stdin/stdout redirected\n") - 1) < 0) 71 { 72 /* Errors ignored. */ 73 } 74 } 75 } 76 77 /* Implement the create_inferior method of the target_ops vector. */ 78 79 int 80 netbsd_process_target::create_inferior (const char *program, 81 const std::vector<char *> &program_args) 82 { 83 std::string str_program_args = construct_inferior_arguments (program_args); 84 85 pid_t pid = fork_inferior (program, str_program_args.c_str (), 86 get_environ ()->envp (), netbsd_ptrace_fun, 87 nullptr, nullptr, nullptr, nullptr); 88 89 add_process (pid, 0); 90 91 post_fork_inferior (pid, program); 92 93 return pid; 94 } 95 96 /* Implement the post_create_inferior target_ops method. */ 97 98 void 99 netbsd_process_target::post_create_inferior () 100 { 101 pid_t pid = current_process ()->pid; 102 netbsd_nat::enable_proc_events (pid); 103 104 low_arch_setup (); 105 } 106 107 /* Implement the attach target_ops method. */ 108 109 int 110 netbsd_process_target::attach (unsigned long pid) 111 { 112 /* Unimplemented. */ 113 return -1; 114 } 115 116 /* Returns true if GDB is interested in any child syscalls. */ 117 118 static bool 119 gdb_catching_syscalls_p (pid_t pid) 120 { 121 struct process_info *proc = find_process_pid (pid); 122 return !proc->syscalls_to_catch.empty (); 123 } 124 125 /* Implement the resume target_ops method. */ 126 127 void 128 netbsd_process_target::resume (struct thread_resume *resume_info, size_t n) 129 { 130 ptid_t resume_ptid = resume_info[0].thread; 131 const int signal = resume_info[0].sig; 132 const bool step = resume_info[0].kind == resume_step; 133 134 if (resume_ptid == minus_one_ptid) 135 resume_ptid = ptid_of (current_thread); 136 137 const pid_t pid = resume_ptid.pid (); 138 const lwpid_t lwp = resume_ptid.lwp (); 139 regcache_invalidate_pid (pid); 140 141 auto fn 142 = [&] (ptid_t ptid) 143 { 144 if (step) 145 { 146 if (ptid.lwp () == lwp || n != 1) 147 { 148 if (ptrace (PT_SETSTEP, pid, NULL, ptid.lwp ()) == -1) 149 perror_with_name (("ptrace")); 150 if (ptrace (PT_RESUME, pid, NULL, ptid.lwp ()) == -1) 151 perror_with_name (("ptrace")); 152 } 153 else 154 { 155 if (ptrace (PT_CLEARSTEP, pid, NULL, ptid.lwp ()) == -1) 156 perror_with_name (("ptrace")); 157 if (ptrace (PT_SUSPEND, pid, NULL, ptid.lwp ()) == -1) 158 perror_with_name (("ptrace")); 159 } 160 } 161 else 162 { 163 if (ptrace (PT_CLEARSTEP, pid, NULL, ptid.lwp ()) == -1) 164 perror_with_name (("ptrace")); 165 if (ptrace (PT_RESUME, pid, NULL, ptid.lwp ()) == -1) 166 perror_with_name (("ptrace")); 167 } 168 }; 169 170 netbsd_nat::for_each_thread (pid, fn); 171 172 int request = gdb_catching_syscalls_p (pid) ? PT_CONTINUE : PT_SYSCALL; 173 174 errno = 0; 175 ptrace (request, pid, (void *)1, signal); 176 if (errno) 177 perror_with_name (("ptrace")); 178 } 179 180 /* Returns true if GDB is interested in the reported SYSNO syscall. */ 181 182 static bool 183 netbsd_catch_this_syscall (int sysno) 184 { 185 struct process_info *proc = current_process (); 186 187 if (proc->syscalls_to_catch.empty ()) 188 return false; 189 190 if (proc->syscalls_to_catch[0] == ANY_SYSCALL) 191 return true; 192 193 for (int iter : proc->syscalls_to_catch) 194 if (iter == sysno) 195 return true; 196 197 return false; 198 } 199 200 /* Helper function for child_wait and the derivatives of child_wait. 201 HOSTSTATUS is the waitstatus from wait() or the equivalent; store our 202 translation of that in OURSTATUS. */ 203 204 static void 205 netbsd_store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus) 206 { 207 if (WIFEXITED (hoststatus)) 208 ourstatus->set_exited (WEXITSTATUS (hoststatus)); 209 else if (!WIFSTOPPED (hoststatus)) 210 ourstatus->set_signalled (gdb_signal_from_host (WTERMSIG (hoststatus))); 211 else 212 ourstatus->set_stopped (gdb_signal_from_host (WSTOPSIG (hoststatus))); 213 } 214 215 /* Implement a safe wrapper around waitpid(). */ 216 217 static pid_t 218 netbsd_waitpid (ptid_t ptid, struct target_waitstatus *ourstatus, 219 target_wait_flags target_options) 220 { 221 int status; 222 int options = (target_options & TARGET_WNOHANG) ? WNOHANG : 0; 223 224 pid_t pid 225 = gdb::handle_eintr (-1, ::waitpid, ptid.pid (), &status, options); 226 227 if (pid == -1) 228 perror_with_name (_("Child process unexpectedly missing")); 229 230 netbsd_store_waitstatus (ourstatus, status); 231 return pid; 232 } 233 234 235 /* Implement the wait target_ops method. 236 237 Wait for the child specified by PTID to do something. Return the 238 process ID of the child, or MINUS_ONE_PTID in case of error; store 239 the status in *OURSTATUS. */ 240 241 static ptid_t 242 netbsd_wait (ptid_t ptid, struct target_waitstatus *ourstatus, 243 target_wait_flags target_options) 244 { 245 pid_t pid = netbsd_waitpid (ptid, ourstatus, target_options); 246 ptid_t wptid = ptid_t (pid); 247 248 if (pid == 0) 249 { 250 gdb_assert (target_options & TARGET_WNOHANG); 251 ourstatus->set_ignore (); 252 return null_ptid; 253 } 254 255 gdb_assert (pid != -1); 256 257 /* If the child stopped, keep investigating its status. */ 258 if (ourstatus->kind () != TARGET_WAITKIND_STOPPED) 259 return wptid; 260 261 /* Extract the event and thread that received a signal. */ 262 ptrace_siginfo_t psi; 263 if (ptrace (PT_GET_SIGINFO, pid, &psi, sizeof (psi)) == -1) 264 perror_with_name (("ptrace")); 265 266 /* Pick child's siginfo_t. */ 267 siginfo_t *si = &psi.psi_siginfo; 268 269 lwpid_t lwp = psi.psi_lwpid; 270 271 int signo = si->si_signo; 272 const int code = si->si_code; 273 274 /* Construct PTID with a specified thread that received the event. 275 If a signal was targeted to the whole process, lwp is 0. */ 276 wptid = ptid_t (pid, lwp, 0); 277 278 /* Bail out on non-debugger oriented signals. */ 279 if (signo != SIGTRAP) 280 return wptid; 281 282 /* Stop examining non-debugger oriented SIGTRAP codes. */ 283 if (code <= SI_USER || code == SI_NOINFO) 284 return wptid; 285 286 /* Process state for threading events. */ 287 ptrace_state_t pst = {}; 288 if (code == TRAP_LWP) 289 if (ptrace (PT_GET_PROCESS_STATE, pid, &pst, sizeof (pst)) == -1) 290 perror_with_name (("ptrace")); 291 292 if (code == TRAP_LWP && pst.pe_report_event == PTRACE_LWP_EXIT) 293 { 294 /* If GDB attaches to a multi-threaded process, exiting 295 threads might be skipped during post_attach that 296 have not yet reported their PTRACE_LWP_EXIT event. 297 Ignore exited events for an unknown LWP. */ 298 thread_info *thr = find_thread_ptid (wptid); 299 if (thr == nullptr) 300 ourstatus->set_spurious (); 301 else 302 { 303 /* NetBSD does not store an LWP exit status. */ 304 ourstatus->set_thread_exited (0); 305 306 remove_thread (thr); 307 } 308 return wptid; 309 } 310 311 if (find_thread_ptid (ptid_t (pid))) 312 switch_to_thread (find_thread_ptid (wptid)); 313 314 if (code == TRAP_LWP && pst.pe_report_event == PTRACE_LWP_CREATE) 315 { 316 /* If GDB attaches to a multi-threaded process, newborn 317 threads might be added by nbsd_add_threads that have 318 not yet reported their PTRACE_LWP_CREATE event. Ignore 319 born events for an already-known LWP. */ 320 if (find_thread_ptid (wptid)) 321 ourstatus->set_spurious (); 322 else 323 { 324 add_thread (wptid, NULL); 325 ourstatus->set_thread_created (); 326 } 327 return wptid; 328 } 329 330 if (code == TRAP_EXEC) 331 { 332 ourstatus->set_execd 333 (make_unique_xstrdup (netbsd_nat::pid_to_exec_file (pid))); 334 return wptid; 335 } 336 337 if (code == TRAP_TRACE) 338 return wptid; 339 340 if (code == TRAP_SCE || code == TRAP_SCX) 341 { 342 int sysnum = si->si_sysnum; 343 344 if (!netbsd_catch_this_syscall(sysnum)) 345 { 346 /* If the core isn't interested in this event, ignore it. */ 347 ourstatus->set_spurious (); 348 return wptid; 349 } 350 351 if (code == TRAP_SCE) 352 ourstatus->set_syscall_entry (sysnum); 353 else 354 ourstatus->set_syscall_return (sysnum); 355 356 return wptid; 357 } 358 359 if (code == TRAP_BRKPT) 360 { 361 #ifdef PTRACE_BREAKPOINT_ADJ 362 CORE_ADDR pc; 363 struct reg r; 364 ptrace (PT_GETREGS, pid, &r, psi.psi_lwpid); 365 pc = PTRACE_REG_PC (&r); 366 PTRACE_REG_SET_PC (&r, pc - PTRACE_BREAKPOINT_ADJ); 367 ptrace (PT_SETREGS, pid, &r, psi.psi_lwpid); 368 #endif 369 return wptid; 370 } 371 372 /* Unclassified SIGTRAP event. */ 373 ourstatus->set_spurious (); 374 return wptid; 375 } 376 377 /* Implement the wait target_ops method. */ 378 379 ptid_t 380 netbsd_process_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, 381 target_wait_flags target_options) 382 { 383 while (true) 384 { 385 ptid_t wptid = netbsd_wait (ptid, ourstatus, target_options); 386 387 /* Register thread in the gdbcore if a thread was not reported earlier. 388 This is required after ::create_inferior, when the gdbcore does not 389 know about the first internal thread. 390 This may also happen on attach, when an event is registered on a thread 391 that was not fully initialized during the attach stage. */ 392 if (wptid.lwp () != 0 && !find_thread_ptid (wptid) 393 && ourstatus->kind () != TARGET_WAITKIND_THREAD_EXITED) 394 add_thread (wptid, nullptr); 395 396 switch (ourstatus->kind ()) 397 { 398 case TARGET_WAITKIND_EXITED: 399 case TARGET_WAITKIND_STOPPED: 400 case TARGET_WAITKIND_SIGNALLED: 401 case TARGET_WAITKIND_FORKED: 402 case TARGET_WAITKIND_VFORKED: 403 case TARGET_WAITKIND_EXECD: 404 case TARGET_WAITKIND_VFORK_DONE: 405 case TARGET_WAITKIND_SYSCALL_ENTRY: 406 case TARGET_WAITKIND_SYSCALL_RETURN: 407 /* Pass the result to the generic code. */ 408 return wptid; 409 case TARGET_WAITKIND_THREAD_CREATED: 410 case TARGET_WAITKIND_THREAD_EXITED: 411 /* The core needlessly stops on these events. */ 412 [[fallthrough]]; 413 case TARGET_WAITKIND_SPURIOUS: 414 /* Spurious events are unhandled by the gdbserver core. */ 415 if (ptrace (PT_CONTINUE, current_process ()->pid, (void *) 1, 0) 416 == -1) 417 perror_with_name (("ptrace")); 418 break; 419 default: 420 error (("Unknown stopped status")); 421 } 422 } 423 } 424 425 /* Implement the kill target_ops method. */ 426 427 int 428 netbsd_process_target::kill (process_info *process) 429 { 430 pid_t pid = process->pid; 431 if (ptrace (PT_KILL, pid, nullptr, 0) == -1) 432 return -1; 433 434 int status; 435 if (gdb::handle_eintr (-1, ::waitpid, pid, &status, 0) == -1) 436 return -1; 437 mourn (process); 438 return 0; 439 } 440 441 /* Implement the detach target_ops method. */ 442 443 int 444 netbsd_process_target::detach (process_info *process) 445 { 446 pid_t pid = process->pid; 447 448 ptrace (PT_DETACH, pid, (void *) 1, 0); 449 mourn (process); 450 return 0; 451 } 452 453 /* Implement the mourn target_ops method. */ 454 455 void 456 netbsd_process_target::mourn (struct process_info *proc) 457 { 458 for_each_thread (proc->pid, remove_thread); 459 460 remove_process (proc); 461 } 462 463 /* Implement the join target_ops method. */ 464 465 void 466 netbsd_process_target::join (int pid) 467 { 468 /* The PT_DETACH is sufficient to detach from the process. 469 So no need to do anything extra. */ 470 } 471 472 /* Implement the thread_alive target_ops method. */ 473 474 bool 475 netbsd_process_target::thread_alive (ptid_t ptid) 476 { 477 return netbsd_nat::thread_alive (ptid); 478 } 479 480 /* Implement the fetch_registers target_ops method. */ 481 482 void 483 netbsd_process_target::fetch_registers (struct regcache *regcache, int regno) 484 { 485 const netbsd_regset_info *regset = get_regs_info (); 486 ptid_t inferior_ptid = ptid_of (current_thread); 487 488 while (regset->size >= 0) 489 { 490 std::vector<char> buf; 491 buf.resize (regset->size); 492 int res = ptrace (regset->get_request, inferior_ptid.pid (), buf.data (), 493 inferior_ptid.lwp ()); 494 if (res == -1) 495 perror_with_name (("ptrace")); 496 regset->store_function (regcache, buf.data ()); 497 regset++; 498 } 499 } 500 501 /* Implement the store_registers target_ops method. */ 502 503 void 504 netbsd_process_target::store_registers (struct regcache *regcache, int regno) 505 { 506 const netbsd_regset_info *regset = get_regs_info (); 507 ptid_t inferior_ptid = ptid_of (current_thread); 508 509 while (regset->size >= 0) 510 { 511 std::vector<char> buf; 512 buf.resize (regset->size); 513 int res = ptrace (regset->get_request, inferior_ptid.pid (), buf.data (), 514 inferior_ptid.lwp ()); 515 if (res == -1) 516 perror_with_name (("ptrace")); 517 518 /* Then overlay our cached registers on that. */ 519 regset->fill_function (regcache, buf.data ()); 520 /* Only now do we write the register set. */ 521 res = ptrace (regset->set_request, inferior_ptid.pid (), buf. data (), 522 inferior_ptid.lwp ()); 523 if (res == -1) 524 perror_with_name (("ptrace")); 525 regset++; 526 } 527 } 528 529 /* Implement the read_memory target_ops method. */ 530 531 int 532 netbsd_process_target::read_memory (CORE_ADDR memaddr, unsigned char *myaddr, 533 int size) 534 { 535 pid_t pid = current_process ()->pid; 536 return netbsd_nat::read_memory (pid, myaddr, memaddr, size, nullptr); 537 } 538 539 /* Implement the write_memory target_ops method. */ 540 541 int 542 netbsd_process_target::write_memory (CORE_ADDR memaddr, 543 const unsigned char *myaddr, int size) 544 { 545 pid_t pid = current_process ()->pid; 546 return netbsd_nat::write_memory (pid, myaddr, memaddr, size, nullptr); 547 } 548 549 /* Implement the request_interrupt target_ops method. */ 550 551 void 552 netbsd_process_target::request_interrupt () 553 { 554 ptid_t inferior_ptid = ptid_of (get_first_thread ()); 555 556 ::kill (inferior_ptid.pid (), SIGINT); 557 } 558 559 /* Read the AUX Vector for the specified PID, wrapping the ptrace(2) call 560 with the PIOD_READ_AUXV operation and using the PT_IO standard input 561 and output arguments. */ 562 563 static size_t 564 netbsd_read_auxv(pid_t pid, void *offs, void *addr, size_t len) 565 { 566 struct ptrace_io_desc pio; 567 568 pio.piod_op = PIOD_READ_AUXV; 569 pio.piod_offs = offs; 570 pio.piod_addr = addr; 571 pio.piod_len = len; 572 573 if (ptrace (PT_IO, pid, &pio, 0) == -1) 574 perror_with_name (("ptrace")); 575 576 return pio.piod_len; 577 } 578 579 /* Copy LEN bytes from inferior's auxiliary vector starting at OFFSET 580 to debugger memory starting at MYADDR. */ 581 582 int 583 netbsd_process_target::read_auxv (int pid, CORE_ADDR offset, 584 unsigned char *myaddr, unsigned int len) 585 { 586 return netbsd_read_auxv (pid, (void *) (intptr_t) offset, myaddr, len); 587 } 588 589 bool 590 netbsd_process_target::supports_z_point_type (char z_type) 591 { 592 switch (z_type) 593 { 594 case Z_PACKET_SW_BP: 595 return true; 596 case Z_PACKET_HW_BP: 597 case Z_PACKET_WRITE_WP: 598 case Z_PACKET_READ_WP: 599 case Z_PACKET_ACCESS_WP: 600 default: 601 return false; /* Not supported. */ 602 } 603 } 604 605 /* Insert {break/watch}point at address ADDR. SIZE is not used. */ 606 607 int 608 netbsd_process_target::insert_point (enum raw_bkpt_type type, CORE_ADDR addr, 609 int size, struct raw_breakpoint *bp) 610 { 611 switch (type) 612 { 613 case raw_bkpt_type_sw: 614 return insert_memory_breakpoint (bp); 615 case raw_bkpt_type_hw: 616 case raw_bkpt_type_write_wp: 617 case raw_bkpt_type_read_wp: 618 case raw_bkpt_type_access_wp: 619 default: 620 return 1; /* Not supported. */ 621 } 622 } 623 624 /* Remove {break/watch}point at address ADDR. SIZE is not used. */ 625 626 int 627 netbsd_process_target::remove_point (enum raw_bkpt_type type, CORE_ADDR addr, 628 int size, struct raw_breakpoint *bp) 629 { 630 switch (type) 631 { 632 case raw_bkpt_type_sw: 633 return remove_memory_breakpoint (bp); 634 case raw_bkpt_type_hw: 635 case raw_bkpt_type_write_wp: 636 case raw_bkpt_type_read_wp: 637 case raw_bkpt_type_access_wp: 638 default: 639 return 1; /* Not supported. */ 640 } 641 } 642 643 /* Implement the stopped_by_sw_breakpoint target_ops method. */ 644 645 bool 646 netbsd_process_target::stopped_by_sw_breakpoint () 647 { 648 ptrace_siginfo_t psi; 649 pid_t pid = current_process ()->pid; 650 651 if (ptrace (PT_GET_SIGINFO, pid, &psi, sizeof (psi)) == -1) 652 perror_with_name (("ptrace")); 653 654 return psi.psi_siginfo.si_signo == SIGTRAP && 655 psi.psi_siginfo.si_code == TRAP_BRKPT; 656 } 657 658 /* Implement the supports_stopped_by_sw_breakpoint target_ops method. */ 659 660 bool 661 netbsd_process_target::supports_stopped_by_sw_breakpoint () 662 { 663 return true; 664 } 665 666 /* Implement the supports_qxfer_siginfo target_ops method. */ 667 668 bool 669 netbsd_process_target::supports_qxfer_siginfo () 670 { 671 return true; 672 } 673 674 /* Implement the qxfer_siginfo target_ops method. */ 675 676 int 677 netbsd_process_target::qxfer_siginfo (const char *annex, unsigned char *readbuf, 678 unsigned const char *writebuf, 679 CORE_ADDR offset, int len) 680 { 681 if (current_thread == nullptr) 682 return -1; 683 684 pid_t pid = current_process ()->pid; 685 686 return netbsd_nat::qxfer_siginfo(pid, annex, readbuf, writebuf, offset, len); 687 } 688 689 /* Implement the supports_non_stop target_ops method. */ 690 691 bool 692 netbsd_process_target::supports_non_stop () 693 { 694 return false; 695 } 696 697 /* Implement the supports_multi_process target_ops method. */ 698 699 bool 700 netbsd_process_target::supports_multi_process () 701 { 702 return true; 703 } 704 705 /* Check if fork events are supported. */ 706 707 bool 708 netbsd_process_target::supports_fork_events () 709 { 710 return false; 711 } 712 713 /* Check if vfork events are supported. */ 714 715 bool 716 netbsd_process_target::supports_vfork_events () 717 { 718 return false; 719 } 720 721 /* Check if exec events are supported. */ 722 723 bool 724 netbsd_process_target::supports_exec_events () 725 { 726 return true; 727 } 728 729 /* Implement the supports_disable_randomization target_ops method. */ 730 731 bool 732 netbsd_process_target::supports_disable_randomization () 733 { 734 return false; 735 } 736 737 /* Extract &phdr and num_phdr in the inferior. Return 0 on success. */ 738 739 template <typename T> 740 int get_phdr_phnum_from_proc_auxv (const pid_t pid, 741 CORE_ADDR *phdr_memaddr, int *num_phdr) 742 { 743 typedef typename std::conditional<sizeof(T) == sizeof(int64_t), 744 Aux64Info, Aux32Info>::type auxv_type; 745 const size_t auxv_size = sizeof (auxv_type); 746 const size_t auxv_buf_size = 128 * sizeof (auxv_type); 747 748 std::vector<char> auxv_buf; 749 auxv_buf.resize (auxv_buf_size); 750 751 netbsd_read_auxv (pid, nullptr, auxv_buf.data (), auxv_buf_size); 752 753 *phdr_memaddr = 0; 754 *num_phdr = 0; 755 756 for (char *buf = auxv_buf.data (); 757 buf < (auxv_buf.data () + auxv_buf_size); 758 buf += auxv_size) 759 { 760 auxv_type *const aux = (auxv_type *) buf; 761 762 switch (aux->a_type) 763 { 764 case AT_PHDR: 765 *phdr_memaddr = aux->a_v; 766 break; 767 case AT_PHNUM: 768 *num_phdr = aux->a_v; 769 break; 770 } 771 772 if (*phdr_memaddr != 0 && *num_phdr != 0) 773 break; 774 } 775 776 if (*phdr_memaddr == 0 || *num_phdr == 0) 777 { 778 warning ("Unexpected missing AT_PHDR and/or AT_PHNUM: " 779 "phdr_memaddr = %s, phdr_num = %d", 780 core_addr_to_string (*phdr_memaddr), *num_phdr); 781 return 2; 782 } 783 784 return 0; 785 } 786 787 /* Return &_DYNAMIC (via PT_DYNAMIC) in the inferior, or 0 if not present. */ 788 789 template <typename T> 790 static CORE_ADDR 791 get_dynamic (const pid_t pid) 792 { 793 typedef typename std::conditional<sizeof(T) == sizeof(int64_t), 794 Elf64_Phdr, Elf32_Phdr>::type phdr_type; 795 const int phdr_size = sizeof (phdr_type); 796 797 CORE_ADDR phdr_memaddr; 798 int num_phdr; 799 if (get_phdr_phnum_from_proc_auxv<T> (pid, &phdr_memaddr, &num_phdr)) 800 return 0; 801 802 std::vector<unsigned char> phdr_buf; 803 phdr_buf.resize (num_phdr * phdr_size); 804 805 if (netbsd_nat::read_memory (pid, phdr_buf.data (), phdr_memaddr, 806 phdr_buf.size (), nullptr)) 807 return 0; 808 809 /* Compute relocation: it is expected to be 0 for "regular" executables, 810 non-zero for PIE ones. */ 811 CORE_ADDR relocation = -1; 812 for (int i = 0; relocation == -1 && i < num_phdr; i++) 813 { 814 phdr_type *const p = (phdr_type *) (phdr_buf.data () + i * phdr_size); 815 816 if (p->p_type == PT_PHDR) 817 relocation = phdr_memaddr - p->p_vaddr; 818 } 819 820 if (relocation == -1) 821 { 822 /* PT_PHDR is optional, but necessary for PIE in general. Fortunately 823 any real world executables, including PIE executables, have always 824 PT_PHDR present. PT_PHDR is not present in some shared libraries or 825 in fpc (Free Pascal 2.4) binaries but neither of those have a need for 826 or present DT_DEBUG anyway (fpc binaries are statically linked). 827 828 Therefore if there exists DT_DEBUG there is always also PT_PHDR. 829 830 GDB could find RELOCATION also from AT_ENTRY - e_entry. */ 831 832 return 0; 833 } 834 835 for (int i = 0; i < num_phdr; i++) 836 { 837 phdr_type *const p = (phdr_type *) (phdr_buf.data () + i * phdr_size); 838 839 if (p->p_type == PT_DYNAMIC) 840 return p->p_vaddr + relocation; 841 } 842 843 return 0; 844 } 845 846 /* Return &_r_debug in the inferior, or -1 if not present. Return value 847 can be 0 if the inferior does not yet have the library list initialized. 848 We look for DT_MIPS_RLD_MAP first. MIPS executables use this instead of 849 DT_DEBUG, although they sometimes contain an unused DT_DEBUG entry too. */ 850 851 template <typename T> 852 static CORE_ADDR 853 get_r_debug (const pid_t pid) 854 { 855 typedef typename std::conditional<sizeof(T) == sizeof(int64_t), 856 Elf64_Dyn, Elf32_Dyn>::type dyn_type; 857 const int dyn_size = sizeof (dyn_type); 858 unsigned char buf[sizeof (dyn_type)]; /* The larger of the two. */ 859 CORE_ADDR map = -1; 860 861 CORE_ADDR dynamic_memaddr = get_dynamic<T> (pid); 862 if (dynamic_memaddr == 0) 863 return map; 864 865 while (netbsd_nat::read_memory (pid, buf, dynamic_memaddr, dyn_size, nullptr) 866 == 0) 867 { 868 dyn_type *const dyn = (dyn_type *) buf; 869 #if defined DT_MIPS_RLD_MAP 870 union 871 { 872 T map; 873 unsigned char buf[sizeof (T)]; 874 } 875 rld_map; 876 877 if (dyn->d_tag == DT_MIPS_RLD_MAP) 878 { 879 if (netbsd_nat::read_memory (pid, rld_map.buf, dyn->d_un.d_val, 880 sizeof (rld_map.buf), nullptr) == 0) 881 return rld_map.map; 882 else 883 break; 884 } 885 #endif /* DT_MIPS_RLD_MAP */ 886 887 if (dyn->d_tag == DT_DEBUG && map == -1) 888 map = dyn->d_un.d_val; 889 890 if (dyn->d_tag == DT_NULL) 891 break; 892 893 dynamic_memaddr += dyn_size; 894 } 895 896 return map; 897 } 898 899 /* Read one pointer from MEMADDR in the inferior. */ 900 901 static int 902 read_one_ptr (const pid_t pid, CORE_ADDR memaddr, CORE_ADDR *ptr, int ptr_size) 903 { 904 /* Go through a union so this works on either big or little endian 905 hosts, when the inferior's pointer size is smaller than the size 906 of CORE_ADDR. It is assumed the inferior's endianness is the 907 same of the superior's. */ 908 909 union 910 { 911 CORE_ADDR core_addr; 912 unsigned int ui; 913 unsigned char uc; 914 } addr; 915 916 int ret = netbsd_nat::read_memory (pid, &addr.uc, memaddr, ptr_size, nullptr); 917 if (ret == 0) 918 { 919 if (ptr_size == sizeof (CORE_ADDR)) 920 *ptr = addr.core_addr; 921 else if (ptr_size == sizeof (unsigned int)) 922 *ptr = addr.ui; 923 else 924 gdb_assert_not_reached ("unhandled pointer size"); 925 } 926 return ret; 927 } 928 929 /* Construct qXfer:libraries-svr4:read reply. */ 930 931 template <typename T> 932 int 933 netbsd_qxfer_libraries_svr4 (const pid_t pid, const char *annex, 934 unsigned char *readbuf, 935 unsigned const char *writebuf, 936 CORE_ADDR offset, int len) 937 { 938 struct link_map_offsets 939 { 940 /* Offset and size of r_debug.r_version. */ 941 int r_version_offset; 942 943 /* Offset and size of r_debug.r_map. */ 944 int r_map_offset; 945 946 /* Offset to l_addr field in struct link_map. */ 947 int l_addr_offset; 948 949 /* Offset to l_name field in struct link_map. */ 950 int l_name_offset; 951 952 /* Offset to l_ld field in struct link_map. */ 953 int l_ld_offset; 954 955 /* Offset to l_next field in struct link_map. */ 956 int l_next_offset; 957 958 /* Offset to l_prev field in struct link_map. */ 959 int l_prev_offset; 960 }; 961 962 static const struct link_map_offsets lmo_32bit_offsets = 963 { 964 0, /* r_version offset. */ 965 4, /* r_debug.r_map offset. */ 966 0, /* l_addr offset in link_map. */ 967 4, /* l_name offset in link_map. */ 968 8, /* l_ld offset in link_map. */ 969 12, /* l_next offset in link_map. */ 970 16 /* l_prev offset in link_map. */ 971 }; 972 973 static const struct link_map_offsets lmo_64bit_offsets = 974 { 975 0, /* r_version offset. */ 976 8, /* r_debug.r_map offset. */ 977 0, /* l_addr offset in link_map. */ 978 8, /* l_name offset in link_map. */ 979 16, /* l_ld offset in link_map. */ 980 24, /* l_next offset in link_map. */ 981 32 /* l_prev offset in link_map. */ 982 }; 983 984 CORE_ADDR lm_addr = 0, lm_prev = 0; 985 CORE_ADDR l_name, l_addr, l_ld, l_next, l_prev; 986 int header_done = 0; 987 988 const struct link_map_offsets *lmo 989 = ((sizeof (T) == sizeof (int64_t)) 990 ? &lmo_64bit_offsets : &lmo_32bit_offsets); 991 int ptr_size = sizeof (T); 992 993 while (annex[0] != '\0') 994 { 995 const char *sep = strchr (annex, '='); 996 if (sep == nullptr) 997 break; 998 999 int name_len = sep - annex; 1000 CORE_ADDR *addrp; 1001 if (name_len == 5 && startswith (annex, "start")) 1002 addrp = &lm_addr; 1003 else if (name_len == 4 && startswith (annex, "prev")) 1004 addrp = &lm_prev; 1005 else 1006 { 1007 annex = strchr (sep, ';'); 1008 if (annex == nullptr) 1009 break; 1010 annex++; 1011 continue; 1012 } 1013 1014 annex = decode_address_to_semicolon (addrp, sep + 1); 1015 } 1016 1017 if (lm_addr == 0) 1018 { 1019 CORE_ADDR r_debug = get_r_debug<T> (pid); 1020 1021 /* We failed to find DT_DEBUG. Such situation will not change 1022 for this inferior - do not retry it. Report it to GDB as 1023 E01, see for the reasons at the GDB solib-svr4.c side. */ 1024 if (r_debug == (CORE_ADDR) -1) 1025 return -1; 1026 1027 if (r_debug != 0) 1028 { 1029 CORE_ADDR map_offset = r_debug + lmo->r_map_offset; 1030 if (read_one_ptr (pid, map_offset, &lm_addr, ptr_size) != 0) 1031 warning ("unable to read r_map from %s", 1032 core_addr_to_string (map_offset)); 1033 } 1034 } 1035 1036 std::string document = "<library-list-svr4 version=\"1.0\""; 1037 1038 while (lm_addr 1039 && read_one_ptr (pid, lm_addr + lmo->l_name_offset, 1040 &l_name, ptr_size) == 0 1041 && read_one_ptr (pid, lm_addr + lmo->l_addr_offset, 1042 &l_addr, ptr_size) == 0 1043 && read_one_ptr (pid, lm_addr + lmo->l_ld_offset, 1044 &l_ld, ptr_size) == 0 1045 && read_one_ptr (pid, lm_addr + lmo->l_prev_offset, 1046 &l_prev, ptr_size) == 0 1047 && read_one_ptr (pid, lm_addr + lmo->l_next_offset, 1048 &l_next, ptr_size) == 0) 1049 { 1050 if (lm_prev != l_prev) 1051 { 1052 warning ("Corrupted shared library list: 0x%lx != 0x%lx", 1053 (long) lm_prev, (long) l_prev); 1054 break; 1055 } 1056 1057 /* Ignore the first entry even if it has valid name as the first entry 1058 corresponds to the main executable. The first entry should not be 1059 skipped if the dynamic loader was loaded late by a static executable 1060 (see solib-svr4.c parameter ignore_first). But in such case the main 1061 executable does not have PT_DYNAMIC present and this function already 1062 exited above due to failed get_r_debug. */ 1063 if (lm_prev == 0) 1064 string_appendf (document, " main-lm=\"0x%lx\"", 1065 (unsigned long) lm_addr); 1066 else 1067 { 1068 unsigned char libname[PATH_MAX]; 1069 1070 /* Not checking for error because reading may stop before 1071 we've got PATH_MAX worth of characters. */ 1072 libname[0] = '\0'; 1073 netbsd_nat::read_memory (pid, libname, l_name, sizeof (libname) - 1, 1074 nullptr); 1075 libname[sizeof (libname) - 1] = '\0'; 1076 if (libname[0] != '\0') 1077 { 1078 if (!header_done) 1079 { 1080 /* Terminate `<library-list-svr4'. */ 1081 document += '>'; 1082 header_done = 1; 1083 } 1084 1085 string_appendf (document, "<library name=\""); 1086 xml_escape_text_append (document, (char *) libname); 1087 string_appendf (document, "\" lm=\"0x%lx\" " 1088 "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>", 1089 (unsigned long) lm_addr, (unsigned long) l_addr, 1090 (unsigned long) l_ld); 1091 } 1092 } 1093 1094 lm_prev = lm_addr; 1095 lm_addr = l_next; 1096 } 1097 1098 if (!header_done) 1099 { 1100 /* Empty list; terminate `<library-list-svr4'. */ 1101 document += "/>"; 1102 } 1103 else 1104 document += "</library-list-svr4>"; 1105 1106 int document_len = document.length (); 1107 if (offset < document_len) 1108 document_len -= offset; 1109 else 1110 document_len = 0; 1111 if (len > document_len) 1112 len = document_len; 1113 1114 memcpy (readbuf, document.data () + offset, len); 1115 1116 return len; 1117 } 1118 1119 /* Return true if FILE is a 64-bit ELF file, 1120 false if the file is not a 64-bit ELF file, 1121 and error if the file is not accessible or doesn't exist. */ 1122 1123 static bool 1124 elf_64_file_p (const char *file) 1125 { 1126 int fd = gdb::handle_eintr (-1, ::open, file, O_RDONLY); 1127 if (fd < 0) 1128 perror_with_name (("open")); 1129 1130 Elf64_Ehdr header; 1131 ssize_t ret = gdb::handle_eintr (-1, ::read, fd, &header, sizeof (header)); 1132 if (ret == -1) 1133 perror_with_name (("read")); 1134 gdb::handle_eintr (-1, ::close, fd); 1135 if (ret != sizeof (header)) 1136 error ("Cannot read ELF file header: %s", file); 1137 1138 if (header.e_ident[EI_MAG0] != ELFMAG0 1139 || header.e_ident[EI_MAG1] != ELFMAG1 1140 || header.e_ident[EI_MAG2] != ELFMAG2 1141 || header.e_ident[EI_MAG3] != ELFMAG3) 1142 error ("Unrecognized ELF file header: %s", file); 1143 1144 return header.e_ident[EI_CLASS] == ELFCLASS64; 1145 } 1146 1147 /* Construct qXfer:libraries-svr4:read reply. */ 1148 1149 int 1150 netbsd_process_target::qxfer_libraries_svr4 (const char *annex, 1151 unsigned char *readbuf, 1152 unsigned const char *writebuf, 1153 CORE_ADDR offset, int len) 1154 { 1155 if (writebuf != nullptr) 1156 return -2; 1157 if (readbuf == nullptr) 1158 return -1; 1159 1160 struct process_info *proc = current_process (); 1161 pid_t pid = proc->pid; 1162 bool is_elf64 = elf_64_file_p (netbsd_nat::pid_to_exec_file (pid)); 1163 1164 if (is_elf64) 1165 return netbsd_qxfer_libraries_svr4<int64_t> (pid, annex, readbuf, 1166 writebuf, offset, len); 1167 else 1168 return netbsd_qxfer_libraries_svr4<int32_t> (pid, annex, readbuf, 1169 writebuf, offset, len); 1170 } 1171 1172 /* Implement the supports_qxfer_libraries_svr4 target_ops method. */ 1173 1174 bool 1175 netbsd_process_target::supports_qxfer_libraries_svr4 () 1176 { 1177 return true; 1178 } 1179 1180 /* Return the name of a file that can be opened to get the symbols for 1181 the child process identified by PID. */ 1182 1183 const char * 1184 netbsd_process_target::pid_to_exec_file (pid_t pid) 1185 { 1186 return netbsd_nat::pid_to_exec_file (pid); 1187 } 1188 1189 /* Implementation of the target_ops method "supports_pid_to_exec_file". */ 1190 1191 bool 1192 netbsd_process_target::supports_pid_to_exec_file () 1193 { 1194 return true; 1195 } 1196 1197 /* Implementation of the target_ops method "supports_hardware_single_step". */ 1198 bool 1199 netbsd_process_target::supports_hardware_single_step () 1200 { 1201 return true; 1202 } 1203 1204 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */ 1205 1206 const gdb_byte * 1207 netbsd_process_target::sw_breakpoint_from_kind (int kind, int *size) 1208 { 1209 static gdb_byte brkpt[PTRACE_BREAKPOINT_SIZE] = {*PTRACE_BREAKPOINT}; 1210 1211 *size = PTRACE_BREAKPOINT_SIZE; 1212 1213 return brkpt; 1214 } 1215 1216 /* Implement the thread_name target_ops method. */ 1217 1218 const char * 1219 netbsd_process_target::thread_name (ptid_t ptid) 1220 { 1221 return netbsd_nat::thread_name (ptid); 1222 } 1223 1224 /* Implement the supports_catch_syscall target_ops method. */ 1225 1226 bool 1227 netbsd_process_target::supports_catch_syscall () 1228 { 1229 return true; 1230 } 1231 1232 /* Implement the supports_read_auxv target_ops method. */ 1233 1234 bool 1235 netbsd_process_target::supports_read_auxv () 1236 { 1237 return true; 1238 } 1239 1240 void 1241 initialize_low () 1242 { 1243 set_target_ops (the_netbsd_target); 1244 } 1245