]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/nto-tdep.c
Return unique_xmalloc_ptr from some solib.c functions
[thirdparty/binutils-gdb.git] / gdb / nto-tdep.c
CommitLineData
1b883d35
KW
1/* nto-tdep.c - general QNX Neutrino target functionality.
2
e2882c85 3 Copyright (C) 2003-2018 Free Software Foundation, Inc.
1b883d35
KW
4
5 Contributed by QNX Software Systems Ltd.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
1b883d35
KW
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
1b883d35 21
b4d5ed91 22#include "defs.h"
53ce3c39 23#include <sys/stat.h>
1b883d35
KW
24#include "nto-tdep.h"
25#include "top.h"
1b883d35 26#include "inferior.h"
45741a9c 27#include "infrun.h"
1b883d35
KW
28#include "gdbarch.h"
29#include "bfd.h"
30#include "elf-bfd.h"
31#include "solib-svr4.h"
32#include "gdbcore.h"
238ae9af
UW
33#include "objfiles.h"
34
d7161de4
AR
35#define QNX_NOTE_NAME "QNX"
36#define QNX_INFO_SECT_NAME "QNX_info"
37
1b883d35
KW
38#ifdef __CYGWIN__
39#include <sys/cygwin.h>
40#endif
41
42#ifdef __CYGWIN__
43static char default_nto_target[] = "C:\\QNXsdk\\target\\qnx6";
44#elif defined(__sun__) || defined(linux)
45static char default_nto_target[] = "/opt/QNXsdk/target/qnx6";
46#else
47static char default_nto_target[] = "";
48#endif
49
50struct nto_target_ops current_nto_target;
51
a9889169
AR
52static const struct inferior_data *nto_inferior_data_reg;
53
1b883d35
KW
54static char *
55nto_target (void)
56{
57 char *p = getenv ("QNX_TARGET");
58
59#ifdef __CYGWIN__
60 static char buf[PATH_MAX];
61 if (p)
90375a0e 62 cygwin_conv_path (CCP_WIN_A_TO_POSIX, p, buf, PATH_MAX);
1b883d35 63 else
90375a0e 64 cygwin_conv_path (CCP_WIN_A_TO_POSIX, default_nto_target, buf, PATH_MAX);
1b883d35
KW
65 return buf;
66#else
67 return p ? p : default_nto_target;
68#endif
69}
70
71/* Take a string such as i386, rs6000, etc. and map it onto CPUTYPE_X86,
72 CPUTYPE_PPC, etc. as defined in nto-share/dsmsgs.h. */
73int
74nto_map_arch_to_cputype (const char *arch)
75{
76 if (!strcmp (arch, "i386") || !strcmp (arch, "x86"))
77 return CPUTYPE_X86;
192cdb19 78 if (!strcmp (arch, "rs6000") || !strcmp (arch, "powerpc"))
1b883d35
KW
79 return CPUTYPE_PPC;
80 if (!strcmp (arch, "mips"))
81 return CPUTYPE_MIPS;
82 if (!strcmp (arch, "arm"))
83 return CPUTYPE_ARM;
84 if (!strcmp (arch, "sh"))
85 return CPUTYPE_SH;
86 return CPUTYPE_UNKNOWN;
87}
88
89int
992f1ddc
PA
90nto_find_and_open_solib (const char *solib, unsigned o_flags,
91 char **temp_pathname)
1b883d35 92{
c32ed3ef
PA
93 char *buf, *arch_path, *nto_root;
94 const char *endian;
91495617 95 const char *base;
1b883d35 96 const char *arch;
08850b56 97 int arch_len, len, ret;
0df8b418
MS
98#define PATH_FMT \
99 "%s/lib:%s/usr/lib:%s/usr/photon/lib:%s/usr/photon/dll:%s/lib/dll"
1b883d35
KW
100
101 nto_root = nto_target ();
f5656ead 102 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
103 {
104 arch = "x86";
105 endian = "";
106 }
f5656ead 107 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 108 "rs6000") == 0
f5656ead 109 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 110 "powerpc") == 0)
1b883d35
KW
111 {
112 arch = "ppc";
113 endian = "be";
114 }
115 else
116 {
f5656ead
TT
117 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
118 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 119 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
120 }
121
d737fd7f
KW
122 /* In case nto_root is short, add strlen(solib)
123 so we can reuse arch_path below. */
1b883d35 124
08850b56
PM
125 arch_len = (strlen (nto_root) + strlen (arch) + strlen (endian) + 2
126 + strlen (solib));
224c3ddb 127 arch_path = (char *) alloca (arch_len);
08850b56
PM
128 xsnprintf (arch_path, arch_len, "%s/%s%s", nto_root, arch, endian);
129
130 len = strlen (PATH_FMT) + strlen (arch_path) * 5 + 1;
224c3ddb 131 buf = (char *) alloca (len);
08850b56
PM
132 xsnprintf (buf, len, PATH_FMT, arch_path, arch_path, arch_path, arch_path,
133 arch_path);
1b883d35 134
9f37bbcc 135 base = lbasename (solib);
492c0ab7
JK
136 ret = openp (buf, OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, base, o_flags,
137 temp_pathname);
d737fd7f
KW
138 if (ret < 0 && base != solib)
139 {
08850b56 140 xsnprintf (arch_path, arch_len, "/%s", solib);
d737fd7f
KW
141 ret = open (arch_path, o_flags, 0);
142 if (temp_pathname)
143 {
144 if (ret >= 0)
14278e1f 145 *temp_pathname = gdb_realpath (arch_path).release ();
d737fd7f 146 else
2c571006 147 *temp_pathname = NULL;
d737fd7f
KW
148 }
149 }
150 return ret;
1b883d35
KW
151}
152
153void
154nto_init_solib_absolute_prefix (void)
155{
156 char buf[PATH_MAX * 2], arch_path[PATH_MAX];
c32ed3ef
PA
157 char *nto_root;
158 const char *endian;
1b883d35
KW
159 const char *arch;
160
161 nto_root = nto_target ();
f5656ead 162 if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name, "i386") == 0)
1b883d35
KW
163 {
164 arch = "x86";
165 endian = "";
166 }
f5656ead 167 else if (strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 168 "rs6000") == 0
f5656ead 169 || strcmp (gdbarch_bfd_arch_info (target_gdbarch ())->arch_name,
1143fffb 170 "powerpc") == 0)
1b883d35
KW
171 {
172 arch = "ppc";
173 endian = "be";
174 }
175 else
176 {
f5656ead
TT
177 arch = gdbarch_bfd_arch_info (target_gdbarch ())->arch_name;
178 endian = gdbarch_byte_order (target_gdbarch ())
4c6b5505 179 == BFD_ENDIAN_BIG ? "be" : "le";
1b883d35
KW
180 }
181
08850b56 182 xsnprintf (arch_path, sizeof (arch_path), "%s/%s%s", nto_root, arch, endian);
1b883d35 183
08850b56 184 xsnprintf (buf, sizeof (buf), "set solib-absolute-prefix %s", arch_path);
1b883d35
KW
185 execute_command (buf, 0);
186}
187
188char **
14ef7606
AR
189nto_parse_redirection (char *pargv[], const char **pin, const char **pout,
190 const char **perr)
1b883d35
KW
191{
192 char **argv;
a121b7c1 193 const char *in, *out, *err, *p;
1b883d35
KW
194 int argc, i, n;
195
196 for (n = 0; pargv[n]; n++);
197 if (n == 0)
198 return NULL;
199 in = "";
200 out = "";
201 err = "";
202
224c3ddb 203 argv = XCNEWVEC (char *, n + 1);
1b883d35
KW
204 argc = n;
205 for (i = 0, n = 0; n < argc; n++)
206 {
207 p = pargv[n];
208 if (*p == '>')
209 {
210 p++;
211 if (*p)
212 out = p;
213 else
214 out = pargv[++n];
215 }
216 else if (*p == '<')
217 {
218 p++;
219 if (*p)
220 in = p;
221 else
222 in = pargv[++n];
223 }
224 else if (*p++ == '2' && *p++ == '>')
225 {
226 if (*p == '&' && *(p + 1) == '1')
227 err = out;
228 else if (*p)
229 err = p;
230 else
231 err = pargv[++n];
232 }
233 else
234 argv[i++] = pargv[n];
235 }
236 *pin = in;
237 *pout = out;
238 *perr = err;
239 return argv;
240}
241
1b883d35 242static CORE_ADDR
b23518f0 243lm_addr (struct so_list *so)
1b883d35 244{
d0e449a1 245 lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info;
1b883d35 246
d0e449a1 247 return li->l_addr;
1b883d35
KW
248}
249
250static CORE_ADDR
251nto_truncate_ptr (CORE_ADDR addr)
252{
f5656ead 253 if (gdbarch_ptr_bit (target_gdbarch ()) == sizeof (CORE_ADDR) * 8)
1b883d35
KW
254 /* We don't need to truncate anything, and the bit twiddling below
255 will fail due to overflow problems. */
256 return addr;
257 else
f5656ead 258 return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (target_gdbarch ())) - 1);
1b883d35
KW
259}
260
63807e1d 261static Elf_Internal_Phdr *
1b883d35
KW
262find_load_phdr (bfd *abfd)
263{
264 Elf_Internal_Phdr *phdr;
265 unsigned int i;
266
267 if (!elf_tdata (abfd))
268 return NULL;
269
270 phdr = elf_tdata (abfd)->phdr;
271 for (i = 0; i < elf_elfheader (abfd)->e_phnum; i++, phdr++)
272 {
273 if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X))
274 return phdr;
275 }
276 return NULL;
277}
278
279void
0542c86d 280nto_relocate_section_addresses (struct so_list *so, struct target_section *sec)
1b883d35
KW
281{
282 /* Neutrino treats the l_addr base address field in link.h as different than
283 the base address in the System V ABI and so the offset needs to be
284 calculated and applied to relocations. */
57e6060e 285 Elf_Internal_Phdr *phdr = find_load_phdr (sec->the_bfd_section->owner);
1b883d35
KW
286 unsigned vaddr = phdr ? phdr->p_vaddr : 0;
287
b23518f0
PM
288 sec->addr = nto_truncate_ptr (sec->addr + lm_addr (so) - vaddr);
289 sec->endaddr = nto_truncate_ptr (sec->endaddr + lm_addr (so) - vaddr);
1b883d35
KW
290}
291
d737fd7f
KW
292/* This is cheating a bit because our linker code is in libc.so. If we
293 ever implement lazy linking, this may need to be re-examined. */
294int
295nto_in_dynsym_resolve_code (CORE_ADDR pc)
296{
3e5d3a5a 297 if (in_plt_section (pc))
d737fd7f
KW
298 return 1;
299 return 0;
300}
301
d737fd7f 302void
468e3d51 303nto_dummy_supply_regset (struct regcache *regcache, char *regs)
d737fd7f
KW
304{
305 /* Do nothing. */
306}
307
d7161de4
AR
308static void
309nto_sniff_abi_note_section (bfd *abfd, asection *sect, void *obj)
310{
311 const char *sectname;
312 unsigned int sectsize;
313 /* Buffer holding the section contents. */
314 char *note;
315 unsigned int namelen;
316 const char *name;
317 const unsigned sizeof_Elf_Nhdr = 12;
318
319 sectname = bfd_get_section_name (abfd, sect);
320 sectsize = bfd_section_size (abfd, sect);
321
322 if (sectsize > 128)
323 sectsize = 128;
324
325 if (sectname != NULL && strstr (sectname, QNX_INFO_SECT_NAME) != NULL)
326 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
327 else if (sectname != NULL && strstr (sectname, "note") != NULL
328 && sectsize > sizeof_Elf_Nhdr)
329 {
330 note = XNEWVEC (char, sectsize);
331 bfd_get_section_contents (abfd, sect, note, 0, sectsize);
332 namelen = (unsigned int) bfd_h_get_32 (abfd, note);
333 name = note + sizeof_Elf_Nhdr;
334 if (sectsize >= namelen + sizeof_Elf_Nhdr
335 && namelen == sizeof (QNX_NOTE_NAME)
336 && 0 == strcmp (name, QNX_NOTE_NAME))
337 *(enum gdb_osabi *) obj = GDB_OSABI_QNXNTO;
338
339 XDELETEVEC (note);
340 }
341}
342
d737fd7f
KW
343enum gdb_osabi
344nto_elf_osabi_sniffer (bfd *abfd)
345{
d7161de4
AR
346 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
347
348 bfd_map_over_sections (abfd,
349 nto_sniff_abi_note_section,
350 &osabi);
351
352 return osabi;
d737fd7f
KW
353}
354
745a434e
AR
355static const char *nto_thread_state_str[] =
356{
357 "DEAD", /* 0 0x00 */
358 "RUNNING", /* 1 0x01 */
359 "READY", /* 2 0x02 */
360 "STOPPED", /* 3 0x03 */
361 "SEND", /* 4 0x04 */
362 "RECEIVE", /* 5 0x05 */
363 "REPLY", /* 6 0x06 */
364 "STACK", /* 7 0x07 */
365 "WAITTHREAD", /* 8 0x08 */
366 "WAITPAGE", /* 9 0x09 */
367 "SIGSUSPEND", /* 10 0x0a */
368 "SIGWAITINFO", /* 11 0x0b */
369 "NANOSLEEP", /* 12 0x0c */
370 "MUTEX", /* 13 0x0d */
371 "CONDVAR", /* 14 0x0e */
372 "JOIN", /* 15 0x0f */
373 "INTR", /* 16 0x10 */
374 "SEM", /* 17 0x11 */
375 "WAITCTX", /* 18 0x12 */
376 "NET_SEND", /* 19 0x13 */
377 "NET_REPLY" /* 20 0x14 */
378};
379
7a114964 380const char *
c15906d8 381nto_extra_thread_info (struct target_ops *self, struct thread_info *ti)
745a434e 382{
7aabaf9d
SM
383 if (ti != NULL && ti->priv != NULL)
384 {
385 nto_thread_info *priv = get_nto_thread_info (ti);
386
387 if (priv->state < ARRAY_SIZE (nto_thread_state_str))
388 return nto_thread_state_str [priv->state];
389 }
745a434e
AR
390 return "";
391}
392
1b883d35 393void
d737fd7f 394nto_initialize_signals (void)
1b883d35 395{
1b883d35
KW
396 /* We use SIG45 for pulses, or something, so nostop, noprint
397 and pass them. */
2ea28649
PA
398 signal_stop_update (gdb_signal_from_name ("SIG45"), 0);
399 signal_print_update (gdb_signal_from_name ("SIG45"), 0);
400 signal_pass_update (gdb_signal_from_name ("SIG45"), 1);
1b883d35
KW
401
402 /* By default we don't want to stop on these two, but we do want to pass. */
403#if defined(SIGSELECT)
404 signal_stop_update (SIGSELECT, 0);
405 signal_print_update (SIGSELECT, 0);
406 signal_pass_update (SIGSELECT, 1);
407#endif
408
409#if defined(SIGPHOTON)
410 signal_stop_update (SIGPHOTON, 0);
411 signal_print_update (SIGPHOTON, 0);
412 signal_pass_update (SIGPHOTON, 1);
413#endif
d737fd7f 414}
8a6c0ccd
AR
415
416/* Read AUXV from initial_stack. */
417LONGEST
418nto_read_auxv_from_initial_stack (CORE_ADDR initial_stack, gdb_byte *readbuf,
419 LONGEST len, size_t sizeof_auxv_t)
420{
421 gdb_byte targ32[4]; /* For 32 bit target values. */
422 gdb_byte targ64[8]; /* For 64 bit target values. */
423 CORE_ADDR data_ofs = 0;
424 ULONGEST anint;
425 LONGEST len_read = 0;
426 gdb_byte *buff;
427 enum bfd_endian byte_order;
428 int ptr_size;
429
430 if (sizeof_auxv_t == 16)
431 ptr_size = 8;
432 else
433 ptr_size = 4;
434
435 /* Skip over argc, argv and envp... Comment from ldd.c:
436
437 The startup frame is set-up so that we have:
438 auxv
439 NULL
440 ...
441 envp2
442 envp1 <----- void *frame + (argc + 2) * sizeof(char *)
443 NULL
444 ...
445 argv2
446 argv1
447 argc <------ void * frame
448
449 On entry to ldd, frame gives the address of argc on the stack. */
450 /* Read argc. 4 bytes on both 64 and 32 bit arches and luckily little
451 * endian. So we just read first 4 bytes. */
452 if (target_read_memory (initial_stack + data_ofs, targ32, 4) != 0)
453 return 0;
454
455 byte_order = gdbarch_byte_order (target_gdbarch ());
456
457 anint = extract_unsigned_integer (targ32, sizeof (targ32), byte_order);
458
459 /* Size of pointer is assumed to be 4 bytes (32 bit arch.) */
460 data_ofs += (anint + 2) * ptr_size; /* + 2 comes from argc itself and
461 NULL terminating pointer in
462 argv. */
463
464 /* Now loop over env table: */
465 anint = 0;
466 while (target_read_memory (initial_stack + data_ofs, targ64, ptr_size)
467 == 0)
468 {
469 if (extract_unsigned_integer (targ64, ptr_size, byte_order) == 0)
470 anint = 1; /* Keep looping until non-null entry is found. */
471 else if (anint)
472 break;
473 data_ofs += ptr_size;
474 }
475 initial_stack += data_ofs;
476
477 memset (readbuf, 0, len);
478 buff = readbuf;
479 while (len_read <= len-sizeof_auxv_t)
480 {
481 if (target_read_memory (initial_stack + len_read, buff, sizeof_auxv_t)
482 == 0)
483 {
484 /* Both 32 and 64 bit structures have int as the first field. */
485 const ULONGEST a_type
486 = extract_unsigned_integer (buff, sizeof (targ32), byte_order);
487
488 if (a_type == AT_NULL)
489 break;
490 buff += sizeof_auxv_t;
491 len_read += sizeof_auxv_t;
492 }
493 else
494 break;
495 }
496 return len_read;
497}
a9889169
AR
498
499/* Allocate new nto_inferior_data object. */
500
501static struct nto_inferior_data *
502nto_new_inferior_data (void)
503{
504 struct nto_inferior_data *const inf_data
505 = XCNEW (struct nto_inferior_data);
506
507 return inf_data;
508}
509
510/* Free inferior data. */
511
512static void
513nto_inferior_data_cleanup (struct inferior *const inf, void *const dat)
514{
515 xfree (dat);
516}
517
518/* Return nto_inferior_data for the given INFERIOR. If not yet created,
519 construct it. */
520
521struct nto_inferior_data *
522nto_inferior_data (struct inferior *const inferior)
523{
524 struct inferior *const inf = inferior ? inferior : current_inferior ();
525 struct nto_inferior_data *inf_data;
526
527 gdb_assert (inf != NULL);
528
fb70bc1a
SM
529 inf_data
530 = (struct nto_inferior_data *) inferior_data (inf, nto_inferior_data_reg);
a9889169
AR
531 if (inf_data == NULL)
532 {
533 set_inferior_data (inf, nto_inferior_data_reg,
534 (inf_data = nto_new_inferior_data ()));
535 }
536
537 return inf_data;
538}
539
a9889169
AR
540void
541_initialize_nto_tdep (void)
542{
543 nto_inferior_data_reg
544 = register_inferior_data_with_cleanup (NULL, nto_inferior_data_cleanup);
545}