From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by sourceware.org (Postfix) with ESMTPS id CBF4A384BC17 for ; Fri, 2 Oct 2020 02:18:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CBF4A384BC17 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gmx.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=n54@gmx.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1601605128; bh=zpDnbFkEfx+l1rQk6GoX3oa1bCtFkJ8sOrDt4kbpQvM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=T/MHaB0nxceGumgWSzcoCcUD+ewQyrw01pbP8zXjW7K9mwSPcXBqz/DbY6IkFmUt8 FMpuyj/QjQioJqLQg2XmxhrasJ9UQyNRcp8EPlxfDpbR6BPJlTES4EuBE4kui6o/th HBvgokbjI/9M4exrrqQZm2FdlciVuFPzfohAjzLk= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([89.79.191.25]) by mail.gmx.com (mrgmx004 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MYvY2-1jtUfQ1Mjw-00Unq2; Fri, 02 Oct 2020 04:18:48 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org Subject: [PATCH 09/10] Include the functions of qxfer_libraries_svr4 in netbsd_process_target Date: Fri, 2 Oct 2020 04:18:03 +0200 Message-Id: <20201002021804.2814-10-n54@gmx.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201002021804.2814-1-n54@gmx.com> References: <20201002021804.2814-1-n54@gmx.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:WBsFwBeEWiuisIjaOlezPi9fhJFp5Go193L+VeFFXIbY6KjHMcC u4cExv/lMPkdnZ18rV3QsdtIjJ2Z6BA9D2XvmMWeJVrdZd9zQU34DMUEQ5J/lgQgF0VYWO6 trJpRsvbMmyqujdn017aEtxqnyptRuLpPyKcjak9eiHbVirEiKTV9nvKb9sxVOQ1izd5bzp +QaHCzXSrHQ8IpscHqJdg== X-UI-Out-Filterresults: notjunk:1;V03:K0:oLl2e79n344=:7DNITmW4P4qRL/3fBlbb+W fXv6OIvrGZcGDJAPqfhVb5AJVnF9LzNCmfTUqvcrzH0T3QaIQJW5Q7v5qBxLRfXdzPLjI7I37 WfMvme47K6E1cqpbU5DfV61WWwHhdfEMCGl4apHd9vcXwEGaF3XQpkEnRVS+9o6DFTXE7qYFd dtYKYAVsbVMqWf0624xdfZ8EkvLpQInih032EsBqhBLN+JjfyS2dyMyrsJLJqbDVuw1Jyj203 +jIZ2rEuDSKjMHlg4w+wjs3ak43oI0/jocgUF/sMtNkANTr3fi8w2T1DJRT0G9SeMXJmhJTjp WdnMlPs5k7qn64XadeOJJof8trFZEf16TinHuKxOsBZyvcXmhC8vIcRLZV8Ngt8aJjcQDmIt7 vsl/vpHYPmIF32HzIUwH7EXAGxRqU8rIl9UCjs5MyFaYy62GNKWdIwAee9DOz3z1w2vBKHu9X t5jK1Js9t/ctqb0irnZvsWKJ/Khrb6FhrWP3Dge6rs4TYj1rSZZB1MiV9Qv+oynNTs3lq976M ICXIoWpxQLnN4gIHtfVAtkvvhkmx/sfsUPTpYpEPecly2t1Kr0QPVBLn+3Ek56ezZnCQmCCub ffZZh9VSvX8UrnmIqxsVYvBQgLjprmYb7/mMKjXepggqnIvSvl3fzBLrZJveBffY7e4OybmOJ +Gf9VTPwrbju9fxv7DDSKgBMS20A/tTW04NN9pBDvaTXjum698EtoTXvFOXxNc8hxvnhNLEfW vUCq/ZypjnZXiKEDsPX+glu5W2mnXn+UlOipHHF8j2ZQHzC70YFmwI2NAgPhgn7BECRoZ2Iji KH7UFl+sK5pTBNuyurJOxP4KDuTsxA3tKIrwPmWFXEEXGtzLCZIaYpZlRhwcNTlYWGEQqcMpT yxy776WqWHzLBrsXvPgboQVIvBVHuxMHFAh5mP4a2YNdUH/cJtsbkLmBTRXhZQWdihi8xvH1i 7dMF8PV4RftXPXuY9NMdbzLIN3rJAoelk6pFod9X2RrnGEKHWuK519pE8FV81iuldI7EMYW9j STburnpuoLh025qKGJs+TPTt1JYODJCiGK3vw6+uXR18n+r9vAeo+sJ1rdLzco9BI3MpzE8jO 3X3C44yCpwXDNeRfan8i41KgXFCB0cp6gPTNEl6G1/aUWW89d2K0dvJd7GdCwVlnFuaZ9aToq WU9ryEjKTA8yKMB4C5qkklH4r4f/JXfv//1JtcjwvKXztNAzyAri7iB4c8dHDVNsB//TopHWG bi8QW0Jy4Dic71JMy X-Spam-Status: No, score=-15.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Oct 2020 02:18:52 -0000 Merge get_phdr_phnum_from_proc_auxv, get_dynamic, get_r_debug and read_one= _ptr in the netbsd_process_target class. All of them are called indirectly from the public target method qxfer_libraries_svr4. For code simplicity, merge netbsd_qxfer_libraries_svr4 into netbsd_process_target::qxfer_libraries_svr4. gdbserver/ChangeLog: * netbsd-low.cc (get_phdr_phnum_from_proc_auxv): Turn into... (netbsd_process_target::get_phdr_phnum_from_proc_auxv): ...this. (get_dynamic): Turn into... (netbsd_process_target::get_dynamic): ...this. (get_r_debug): Turn into... (netbsd_process_target::get_r_debug): ...this. (read_one_ptr): Turn into... (netbsd_process_target::read_one_ptr): ...this. (netbsd_qxfer_libraries_svr4): Merge into... (netbsd_process_target::qxfer_libraries_svr4): ...this. * netbsd-low.h (netbsd_process_target::get_phdr_phnum_from_proc_auxv) (netbsd_process_target::get_dynamic) (netbsd_process_target::get_r_debug) (netbsd_process_target::read_one_ptr): Add. =2D-- gdbserver/ChangeLog | 18 +++++ gdbserver/netbsd-low.cc | 161 ++++++++++++++++++---------------------- gdbserver/netbsd-low.h | 20 +++++ 3 files changed, 111 insertions(+), 88 deletions(-) diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index d81d961432a..0c1c40e0581 100644 =2D-- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,21 @@ +2020-10-01 Kamil Rytarowski + + * netbsd-low.cc (get_phdr_phnum_from_proc_auxv): Turn into... + (netbsd_process_target::get_phdr_phnum_from_proc_auxv): ...this. + (get_dynamic): Turn into... + (netbsd_process_target::get_dynamic): ...this. + (get_r_debug): Turn into... + (netbsd_process_target::get_r_debug): ...this. + (read_one_ptr): Turn into... + (netbsd_process_target::read_one_ptr): ...this. + (netbsd_qxfer_libraries_svr4): Merge into... + (netbsd_process_target::qxfer_libraries_svr4): ...this. + * netbsd-low.h + (netbsd_process_target::get_phdr_phnum_from_proc_auxv) + (netbsd_process_target::get_dynamic) + (netbsd_process_target::get_r_debug) + (netbsd_process_target::read_one_ptr): Add. + 2020-10-01 Kamil Rytarowski * netbsd-low.cc (netbsd_catch_this_syscall): Turn into... diff --git a/gdbserver/netbsd-low.cc b/gdbserver/netbsd-low.cc index 9a55bd42713..f1011cdfe73 100644 =2D-- a/gdbserver/netbsd-low.cc +++ b/gdbserver/netbsd-low.cc @@ -798,11 +798,13 @@ netbsd_process_target::supports_disable_randomizatio= n () return false; } -/* Extract &phdr and num_phdr in the inferior. Return 0 on success. */ +/* See netbsd-low.h. */ template -int get_phdr_phnum_from_proc_auxv (const pid_t pid, - CORE_ADDR *phdr_memaddr, int *num_phdr) +int +netbsd_process_target::get_phdr_phnum_from_proc_auxv (const pid_t pid, + CORE_ADDR *phdr_memaddr, + int *num_phdr) { typedef typename std::conditional::type auxv_type; @@ -848,11 +850,11 @@ int get_phdr_phnum_from_proc_auxv (const pid_t pid, return 0; } -/* Return &_DYNAMIC (via PT_DYNAMIC) in the inferior, or 0 if not present= . */ +/* See netbsd-low.h. */ template -static CORE_ADDR -get_dynamic (netbsd_process_target *target, const pid_t pid) +CORE_ADDR +netbsd_process_target::get_dynamic (const pid_t pid) { typedef typename std::conditional::type phdr_type; @@ -866,7 +868,7 @@ get_dynamic (netbsd_process_target *target, const pid_= t pid) std::vector phdr_buf; phdr_buf.resize (num_phdr * phdr_size); - if (target->read_memory (phdr_memaddr, phdr_buf.data (), phdr_buf.size = ())) + if (read_memory (phdr_memaddr, phdr_buf.data (), phdr_buf.size ())) return 0; /* Compute relocation: it is expected to be 0 for "regular" executables= , @@ -906,14 +908,11 @@ get_dynamic (netbsd_process_target *target, const pi= d_t pid) return 0; } -/* Return &_r_debug in the inferior, or -1 if not present. Return value - can be 0 if the inferior does not yet have the library list initialize= d. - We look for DT_MIPS_RLD_MAP first. MIPS executables use this instead = of - DT_DEBUG, although they sometimes contain an unused DT_DEBUG entry too= . */ +/* See netbsd-low.h. */ template -static CORE_ADDR -get_r_debug (netbsd_process_target *target, const int pid) +CORE_ADDR +netbsd_process_target::get_r_debug (const int pid) { typedef typename std::conditional::type dyn_type; @@ -921,11 +920,11 @@ get_r_debug (netbsd_process_target *target, const in= t pid) unsigned char buf[sizeof (dyn_type)]; /* The larger of the two. */ CORE_ADDR map =3D -1; - CORE_ADDR dynamic_memaddr =3D get_dynamic (target, pid); + CORE_ADDR dynamic_memaddr =3D get_dynamic (pid); if (dynamic_memaddr =3D=3D 0) return map; - while (target->read_memory (dynamic_memaddr, buf, dyn_size) =3D=3D 0) + while (read_memory (dynamic_memaddr, buf, dyn_size) =3D=3D 0) { dyn_type *const dyn =3D (dyn_type *) buf; #if defined DT_MIPS_RLD_MAP @@ -958,11 +957,11 @@ get_r_debug (netbsd_process_target *target, const in= t pid) return map; } -/* Read one pointer from MEMADDR in the inferior. */ +/* See netbsd-low.h. */ -static int -read_one_ptr (netbsd_process_target *target, CORE_ADDR memaddr, CORE_ADDR= *ptr, - int ptr_size) +int +netbsd_process_target::read_one_ptr (CORE_ADDR memaddr, CORE_ADDR *ptr, + int ptr_size) { /* Go through a union so this works on either big or little endian hosts, when the inferior's pointer size is smaller than the size @@ -976,7 +975,7 @@ read_one_ptr (netbsd_process_target *target, CORE_ADDR= memaddr, CORE_ADDR *ptr, unsigned char uc; } addr; - int ret =3D target->read_memory (memaddr, &addr.uc, ptr_size); + int ret =3D read_memory (memaddr, &addr.uc, ptr_size); if (ret =3D=3D 0) { if (ptr_size =3D=3D sizeof (CORE_ADDR)) @@ -989,15 +988,39 @@ read_one_ptr (netbsd_process_target *target, CORE_AD= DR memaddr, CORE_ADDR *ptr, return ret; } +/* See netbsd-low.h. */ + +bool +netbsd_process_target::elf_64_file_p (const char *file) +{ + int fd =3D gdb::handle_eintr (-1, ::open, file, O_RDONLY); + if (fd < 0) + perror_with_name (("open")); + + Elf64_Ehdr header; + ssize_t ret =3D gdb::handle_eintr (-1, ::read, fd, &header, si= zeof (header)); + if (ret =3D=3D -1) + perror_with_name (("read")); + gdb::handle_eintr (-1, ::close, fd); + if (ret !=3D sizeof (header)) + error ("Cannot read ELF file header: %s", file); + + if (header.e_ident[EI_MAG0] !=3D ELFMAG0 + || header.e_ident[EI_MAG1] !=3D ELFMAG1 + || header.e_ident[EI_MAG2] !=3D ELFMAG2 + || header.e_ident[EI_MAG3] !=3D ELFMAG3) + error ("Unrecognized ELF file header: %s", file); + + return header.e_ident[EI_CLASS] =3D=3D ELFCLASS64; +} + /* Construct qXfer:libraries-svr4:read reply. */ -template int -netbsd_qxfer_libraries_svr4 (netbsd_process_target *target, - const pid_t pid, const char *annex, - unsigned char *readbuf, - unsigned const char *writebuf, - CORE_ADDR offset, int len) +netbsd_process_target::qxfer_libraries_svr4 (const char *annex, + unsigned char *readbuf, + unsigned const char *writebuf, + CORE_ADDR offset, int len) { struct link_map_offsets { @@ -1049,10 +1072,18 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target= *target, CORE_ADDR l_name, l_addr, l_ld, l_next, l_prev; int header_done =3D 0; + if (writebuf !=3D nullptr) + return -2; + if (readbuf =3D=3D nullptr) + return -1; + + struct process_info *proc =3D current_process (); + pid_t pid =3D proc->pid; + bool is_elf64 =3D elf_64_file_p (netbsd_nat::pid_to_exec_file (pid)); + const struct link_map_offsets *lmo - =3D ((sizeof (T) =3D=3D sizeof (int64_t)) - ? &lmo_64bit_offsets : &lmo_32bit_offsets); - int ptr_size =3D sizeof (T); + =3D (is_elf64 ? &lmo_64bit_offsets : &lmo_32bit_offsets); + int ptr_size =3D is_elf64 ? sizeof (int64_t) : sizeof (int32_t); while (annex[0] !=3D '\0') { @@ -1080,7 +1111,12 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target = *target, if (lm_addr =3D=3D 0) { - CORE_ADDR r_debug =3D get_r_debug (target, pid); + CORE_ADDR r_debug; + + if (is_elf64) + r_debug =3D get_r_debug (pid); + else + r_debug =3D get_r_debug (pid); /* We failed to find DT_DEBUG. Such situation will not change for this inferior - do not retry it. Report it to GDB as @@ -1091,7 +1127,7 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target *= target, if (r_debug !=3D 0) { CORE_ADDR map_offset =3D r_debug + lmo->r_map_offset; - if (read_one_ptr (target, map_offset, &lm_addr, ptr_size) !=3D 0) + if (read_one_ptr (map_offset, &lm_addr, ptr_size) !=3D 0) warning ("unable to read r_map from %s", core_addr_to_string (map_offset)); } @@ -1100,15 +1136,15 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target= *target, std::string document =3D "l_name_offset, + && read_one_ptr (lm_addr + lmo->l_name_offset, &l_name, ptr_size) =3D=3D 0 - && read_one_ptr (target, lm_addr + lmo->l_addr_offset, + && read_one_ptr (lm_addr + lmo->l_addr_offset, &l_addr, ptr_size) =3D=3D 0 - && read_one_ptr (target, lm_addr + lmo->l_ld_offset, + && read_one_ptr (lm_addr + lmo->l_ld_offset, &l_ld, ptr_size) =3D=3D 0 - && read_one_ptr (target, lm_addr + lmo->l_prev_offset, + && read_one_ptr (lm_addr + lmo->l_prev_offset, &l_prev, ptr_size) =3D=3D 0 - && read_one_ptr (target, lm_addr + lmo->l_next_offset, + && read_one_ptr (lm_addr + lmo->l_next_offset, &l_next, ptr_size) =3D=3D 0) { if (lm_prev !=3D l_prev) @@ -1134,7 +1170,7 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target *= target, /* Not checking for error because reading may stop before we've got PATH_MAX worth of characters. */ libname[0] =3D '\0'; - target->read_memory (l_name, libname, sizeof (libname) - 1); + read_memory (l_name, libname, sizeof (libname) - 1); libname[sizeof (libname) - 1] =3D '\0'; if (libname[0] !=3D '\0') { @@ -1179,57 +1215,6 @@ netbsd_qxfer_libraries_svr4 (netbsd_process_target = *target, return len; } -/* See netbsd-low.h. */ - -bool -netbsd_process_target::elf_64_file_p (const char *file) -{ - int fd =3D gdb::handle_eintr (-1, ::open, file, O_RDONLY); - if (fd < 0) - perror_with_name (("open")); - - Elf64_Ehdr header; - ssize_t ret =3D gdb::handle_eintr (-1, ::read, fd, &header, si= zeof (header)); - if (ret =3D=3D -1) - perror_with_name (("read")); - gdb::handle_eintr (-1, ::close, fd); - if (ret !=3D sizeof (header)) - error ("Cannot read ELF file header: %s", file); - - if (header.e_ident[EI_MAG0] !=3D ELFMAG0 - || header.e_ident[EI_MAG1] !=3D ELFMAG1 - || header.e_ident[EI_MAG2] !=3D ELFMAG2 - || header.e_ident[EI_MAG3] !=3D ELFMAG3) - error ("Unrecognized ELF file header: %s", file); - - return header.e_ident[EI_CLASS] =3D=3D ELFCLASS64; -} - -/* Construct qXfer:libraries-svr4:read reply. */ - -int -netbsd_process_target::qxfer_libraries_svr4 (const char *annex, - unsigned char *readbuf, - unsigned const char *writebuf, - CORE_ADDR offset, int len) -{ - if (writebuf !=3D nullptr) - return -2; - if (readbuf =3D=3D nullptr) - return -1; - - struct process_info *proc =3D current_process (); - pid_t pid =3D proc->pid; - bool is_elf64 =3D elf_64_file_p (netbsd_nat::pid_to_exec_file (pid)); - - if (is_elf64) - return netbsd_qxfer_libraries_svr4 (this, pid, annex, readbu= f, - writebuf, offset, len); - else - return netbsd_qxfer_libraries_svr4 (this, pid, annex, readbu= f, - writebuf, offset, len); -} - /* Implement the supports_qxfer_libraries_svr4 target_ops method. */ bool diff --git a/gdbserver/netbsd-low.h b/gdbserver/netbsd-low.h index 7ed08dc90fa..338293d74a6 100644 =2D-- a/gdbserver/netbsd-low.h +++ b/gdbserver/netbsd-low.h @@ -156,6 +156,26 @@ class netbsd_process_target : public process_stratum_= target /* Returns true if GDB is interested in the reported SYSNO syscall. */ bool netbsd_catch_this_syscall (int sysno); + /* Extract &phdr and num_phdr in the inferior. Return 0 on success. *= / + template int + get_phdr_phnum_from_proc_auxv (const pid_t pid, + CORE_ADDR *phdr_memaddr, + int *num_phdr); + + /* Return &_DYNAMIC (via PT_DYNAMIC) in the inferior, or 0 if not prese= nt. */ + template CORE_ADDR + get_dynamic (const pid_t pid); + + /* Return &_r_debug in the inferior, or -1 if not present. Return valu= e + can be 0 if the inferior does not yet have the library list initiali= zed. + We look for DT_MIPS_RLD_MAP first. MIPS executables use this instea= d of + DT_DEBUG, although they sometimes contain an unused DT_DEBUG entry t= oo. */ + template + CORE_ADDR get_r_debug (const int pid); + + /* Read one pointer from MEMADDR in the inferior. */ + int read_one_ptr (CORE_ADDR memaddr, CORE_ADDR *ptr, int ptr_size); + protected: /* The architecture-specific "low" methods are listed below. */ =2D- 2.28.0