198944Sobrien/* Provide legacy r_debug and link_map support for SVR4-like native targets. 298944Sobrien Copyright 2000, 2001 398944Sobrien Free Software Foundation, Inc. 498944Sobrien 598944Sobrien This file is part of GDB. 698944Sobrien 798944Sobrien This program is free software; you can redistribute it and/or modify 898944Sobrien it under the terms of the GNU General Public License as published by 998944Sobrien the Free Software Foundation; either version 2 of the License, or 1098944Sobrien (at your option) any later version. 1198944Sobrien 1298944Sobrien This program is distributed in the hope that it will be useful, 1398944Sobrien but WITHOUT ANY WARRANTY; without even the implied warranty of 1498944Sobrien MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1598944Sobrien GNU General Public License for more details. 1698944Sobrien 1798944Sobrien You should have received a copy of the GNU General Public License 1898944Sobrien along with this program; if not, write to the Free Software 1998944Sobrien Foundation, Inc., 59 Temple Place - Suite 330, 2098944Sobrien Boston, MA 02111-1307, USA. */ 2198944Sobrien 2298944Sobrien#include "defs.h" 2398944Sobrien#include "gdbcore.h" 2498944Sobrien#include "solib-svr4.h" 2598944Sobrien 2698944Sobrien#ifdef HAVE_LINK_H 2798944Sobrien 2898944Sobrien#ifdef HAVE_NLIST_H 2998944Sobrien/* nlist.h needs to be included before link.h on some older *BSD systems. */ 3098944Sobrien#include <nlist.h> 3198944Sobrien#endif 3298944Sobrien 3398944Sobrien#include <link.h> 3498944Sobrien 3598944Sobrien/* Fetch (and possibly build) an appropriate link_map_offsets structure 3698944Sobrien for native targets using struct definitions from link.h. */ 3798944Sobrien 3898944Sobrienstatic struct link_map_offsets * 3998944Sobrienlegacy_svr4_fetch_link_map_offsets (void) 4098944Sobrien{ 4198944Sobrien static struct link_map_offsets lmo; 4298944Sobrien static struct link_map_offsets *lmp = 0; 4398944Sobrien#if defined (HAVE_STRUCT_LINK_MAP32) 4498944Sobrien static struct link_map_offsets lmo32; 4598944Sobrien static struct link_map_offsets *lmp32 = 0; 4698944Sobrien#endif 4798944Sobrien 4898944Sobrien#ifndef offsetof 4998944Sobrien#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) 5098944Sobrien#endif 5198944Sobrien#define fieldsize(TYPE, MEMBER) (sizeof (((TYPE *)0)->MEMBER)) 5298944Sobrien 5398944Sobrien if (lmp == 0) 5498944Sobrien { 5598944Sobrien lmp = &lmo; 5698944Sobrien 5798944Sobrien#ifdef HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS 5898944Sobrien lmo.r_debug_size = sizeof (struct r_debug); 5998944Sobrien 6098944Sobrien lmo.r_map_offset = offsetof (struct r_debug, r_map); 6198944Sobrien lmo.r_map_size = fieldsize (struct r_debug, r_map); 6298944Sobrien 6398944Sobrien lmo.link_map_size = sizeof (struct link_map); 6498944Sobrien 6598944Sobrien lmo.l_addr_offset = offsetof (struct link_map, l_addr); 6698944Sobrien lmo.l_addr_size = fieldsize (struct link_map, l_addr); 6798944Sobrien 6898944Sobrien lmo.l_next_offset = offsetof (struct link_map, l_next); 6998944Sobrien lmo.l_next_size = fieldsize (struct link_map, l_next); 7098944Sobrien 7198944Sobrien lmo.l_prev_offset = offsetof (struct link_map, l_prev); 7298944Sobrien lmo.l_prev_size = fieldsize (struct link_map, l_prev); 7398944Sobrien 7498944Sobrien lmo.l_name_offset = offsetof (struct link_map, l_name); 7598944Sobrien lmo.l_name_size = fieldsize (struct link_map, l_name); 7698944Sobrien#else /* !defined(HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS) */ 7798944Sobrien#ifdef HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS 7898944Sobrien lmo.link_map_size = sizeof (struct link_map); 7998944Sobrien 8098944Sobrien lmo.l_addr_offset = offsetof (struct link_map, lm_addr); 8198944Sobrien lmo.l_addr_size = fieldsize (struct link_map, lm_addr); 8298944Sobrien 8398944Sobrien lmo.l_next_offset = offsetof (struct link_map, lm_next); 8498944Sobrien lmo.l_next_size = fieldsize (struct link_map, lm_next); 8598944Sobrien 8698944Sobrien lmo.l_name_offset = offsetof (struct link_map, lm_name); 8798944Sobrien lmo.l_name_size = fieldsize (struct link_map, lm_name); 8898944Sobrien#else /* !defined(HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS) */ 8998944Sobrien#if HAVE_STRUCT_SO_MAP_WITH_SOM_MEMBERS 9098944Sobrien lmo.link_map_size = sizeof (struct so_map); 9198944Sobrien 9298944Sobrien lmo.l_addr_offset = offsetof (struct so_map, som_addr); 9398944Sobrien lmo.l_addr_size = fieldsize (struct so_map, som_addr); 9498944Sobrien 9598944Sobrien lmo.l_next_offset = offsetof (struct so_map, som_next); 9698944Sobrien lmo.l_next_size = fieldsize (struct so_map, som_next); 9798944Sobrien 9898944Sobrien lmo.l_name_offset = offsetof (struct so_map, som_path); 9998944Sobrien lmo.l_name_size = fieldsize (struct so_map, som_path); 10098944Sobrien#endif /* HAVE_STRUCT_SO_MAP_WITH_SOM_MEMBERS */ 10198944Sobrien#endif /* HAVE_STRUCT_LINK_MAP_WITH_LM_MEMBERS */ 10298944Sobrien#endif /* HAVE_STRUCT_LINK_MAP_WITH_L_MEMBERS */ 10398944Sobrien } 10498944Sobrien 10598944Sobrien#if defined (HAVE_STRUCT_LINK_MAP32) 10698944Sobrien if (lmp32 == 0) 10798944Sobrien { 10898944Sobrien lmp32 = &lmo32; 10998944Sobrien 11098944Sobrien lmo32.r_debug_size = sizeof (struct r_debug32); 11198944Sobrien 11298944Sobrien lmo32.r_map_offset = offsetof (struct r_debug32, r_map); 11398944Sobrien lmo32.r_map_size = fieldsize (struct r_debug32, r_map); 11498944Sobrien 11598944Sobrien lmo32.link_map_size = sizeof (struct link_map32); 11698944Sobrien 11798944Sobrien lmo32.l_addr_offset = offsetof (struct link_map32, l_addr); 11898944Sobrien lmo32.l_addr_size = fieldsize (struct link_map32, l_addr); 11998944Sobrien 12098944Sobrien lmo32.l_next_offset = offsetof (struct link_map32, l_next); 12198944Sobrien lmo32.l_next_size = fieldsize (struct link_map32, l_next); 12298944Sobrien 12398944Sobrien lmo32.l_prev_offset = offsetof (struct link_map32, l_prev); 12498944Sobrien lmo32.l_prev_size = fieldsize (struct link_map32, l_prev); 12598944Sobrien 12698944Sobrien lmo32.l_name_offset = offsetof (struct link_map32, l_name); 12798944Sobrien lmo32.l_name_size = fieldsize (struct link_map32, l_name); 12898944Sobrien } 12998944Sobrien#endif /* defined (HAVE_STRUCT_LINK_MAP32) */ 13098944Sobrien 13198944Sobrien#if defined (HAVE_STRUCT_LINK_MAP32) 13298944Sobrien if (exec_bfd != NULL) 13398944Sobrien { 13498944Sobrien if (bfd_get_arch_size (exec_bfd) == 32) 13598944Sobrien return lmp32; 13698944Sobrien } 13798944Sobrien if (TARGET_PTR_BIT == 32) 13898944Sobrien return lmp32; 13998944Sobrien#endif 14098944Sobrien return lmp; 14198944Sobrien} 14298944Sobrien 14398944Sobrien#endif /* HAVE_LINK_H */ 14498944Sobrien 145130803Smarcelextern initialize_file_ftype _initialize_svr4_lm; /* -Wmissing-prototypes */ 146130803Smarcel 14798944Sobrienvoid 14898944Sobrien_initialize_svr4_lm (void) 14998944Sobrien{ 15098944Sobrien#ifdef HAVE_LINK_H 15198944Sobrien legacy_svr4_fetch_link_map_offsets_hook = legacy_svr4_fetch_link_map_offsets; 15298944Sobrien#endif /* HAVE_LINK_H */ 15398944Sobrien} 154