source: trunk/src/binutils/bfd/libnlm.h@ 610

Last change on this file since 610 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 10.2 KB
Line 
1/* BFD back-end data structures for NLM (NetWare Loadable Modules) files.
2 Copyright 1993, 1994, 2001, 2002 Free Software Foundation, Inc.
3 Written by Cygnus Support.
4
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21#ifndef _LIBNLM_H_
22#define _LIBNLM_H_ 1
23
24#ifdef ARCH_SIZE
25# define NLM_ARCH_SIZE ARCH_SIZE
26#endif
27#include "nlm/common.h"
28#include "nlm/internal.h"
29#include "nlm/external.h"
30
31/* A reloc for an imported NLM symbol. Normal relocs are associated
32 with sections, and include a symbol. These relocs are associated
33 with (undefined) symbols, and include a section. */
34
35struct nlm_relent
36{
37 /* Section of reloc. */
38 asection *section;
39 /* Reloc info (sym_ptr_ptr field set only when canonicalized). */
40 arelent reloc;
41};
42
43/* Information we keep for an NLM symbol. */
44
45typedef struct
46{
47 /* BFD symbol. */
48 asymbol symbol;
49 /* Number of reloc entries for imported symbol. */
50 bfd_size_type rcnt;
51 /* Array of reloc information for imported symbol. */
52 struct nlm_relent *relocs;
53} nlmNAME(symbol_type);
54
55extern bfd_boolean nlm_mkobject
56 PARAMS ((bfd *));
57extern bfd_boolean nlm_set_arch_mach
58 PARAMS ((bfd *, enum bfd_architecture, unsigned long));
59
60extern void nlmNAME(get_symbol_info)
61 PARAMS ((bfd *, asymbol *, symbol_info *));
62extern long nlmNAME(get_symtab_upper_bound)
63 PARAMS ((bfd *));
64extern long nlmNAME(get_symtab)
65 PARAMS ((bfd *, asymbol **));
66extern asymbol *nlmNAME(make_empty_symbol)
67 PARAMS ((bfd *));
68extern void nlmNAME(print_symbol)
69 PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
70extern long nlmNAME(get_reloc_upper_bound)
71 PARAMS ((bfd *, asection *));
72extern long nlmNAME(canonicalize_reloc)
73 PARAMS ((bfd *, asection *, arelent **, asymbol **));
74extern const bfd_target *nlmNAME(object_p)
75 PARAMS ((bfd *));
76extern bfd_boolean nlmNAME(set_arch_mach)
77 PARAMS ((bfd *, enum bfd_architecture, unsigned long));
78extern bfd_boolean nlmNAME(set_section_contents)
79 PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type));
80extern bfd_boolean nlmNAME(write_object_contents)
81 PARAMS ((bfd *));
82
83/* Some private data is stashed away for future use using the tdata pointer
84 in the bfd structure. */
85
86struct nlm_obj_tdata
87{
88 /* Actual data, but ref like ptr */
89 Nlm_Internal_Fixed_Header nlm_fixed_hdr[1];
90 Nlm_Internal_Variable_Header nlm_variable_hdr[1];
91 Nlm_Internal_Version_Header nlm_version_hdr[1];
92 Nlm_Internal_Copyright_Header nlm_copyright_hdr[1];
93 Nlm_Internal_Extended_Header nlm_extended_hdr[1];
94 Nlm_Internal_Custom_Header nlm_custom_hdr[1];
95 Nlm_Internal_Cygnus_Ext_Header nlm_cygnus_ext_hdr[1];
96 /* BFD NLM symbols. */
97 nlmNAME(symbol_type) *nlm_symbols;
98 /* Lowest text and data VMA values. */
99 bfd_vma nlm_text_low;
100 bfd_vma nlm_data_low;
101 /* Caches for data read from object file. */
102 arelent * nlm_reloc_fixups;
103 asection ** nlm_reloc_fixup_secs;
104 /* Backend specific information. This should probably be a pointer,
105 but that would require yet another entry point to initialize the
106 structure. */
107 union
108 {
109 struct /* Alpha backend information. */
110 {
111 bfd_vma gp; /* GP value. */
112 bfd_vma lita_address; /* .lita section address. */
113 bfd_size_type lita_size; /* .lita section size. */
114 }
115 alpha_backend_data;
116 }
117 backend_data;
118};
119
120#define nlm_tdata(bfd) ((bfd) -> tdata.nlm_obj_data)
121#define nlm_fixed_header(bfd) (nlm_tdata(bfd) -> nlm_fixed_hdr)
122#define nlm_variable_header(bfd) (nlm_tdata(bfd) -> nlm_variable_hdr)
123#define nlm_version_header(bfd) (nlm_tdata(bfd) -> nlm_version_hdr)
124#define nlm_copyright_header(bfd) (nlm_tdata(bfd) -> nlm_copyright_hdr)
125#define nlm_extended_header(bfd) (nlm_tdata(bfd) -> nlm_extended_hdr)
126#define nlm_custom_header(bfd) (nlm_tdata(bfd) -> nlm_custom_hdr)
127#define nlm_cygnus_ext_header(bfd) (nlm_tdata(bfd) -> nlm_cygnus_ext_hdr)
128#define nlm_get_symbols(bfd) (nlm_tdata(bfd) -> nlm_symbols)
129#define nlm_set_symbols(bfd, p) (nlm_tdata(bfd) -> nlm_symbols = (p))
130#define nlm_set_text_low(bfd, i) (nlm_tdata(bfd) -> nlm_text_low = (i))
131#define nlm_get_text_low(bfd) (nlm_tdata(bfd) -> nlm_text_low)
132#define nlm_set_data_low(bfd, i) (nlm_tdata(bfd) -> nlm_data_low = (i))
133#define nlm_get_data_low(bfd) (nlm_tdata(bfd) -> nlm_data_low)
134#define nlm_relocation_fixups(bfd) (nlm_tdata(bfd) -> nlm_reloc_fixups)
135#define nlm_relocation_fixup_secs(bfd) (nlm_tdata(bfd)->nlm_reloc_fixup_secs)
136
137#define nlm_alpha_backend_data(bfd) \
138 (&nlm_tdata (bfd)->backend_data.alpha_backend_data)
139
140/* This is used when writing out the external relocs. */
141
142struct reloc_and_sec
143{
144 arelent *rel;
145 asection *sec;
146};
147
148/* We store some function pointer in the backend structure. This lets
149 different NLM targets share most of the same code, while providing
150 slightly different code where necessary. */
151
152struct nlm_backend_data
153{
154 /* Signature for this backend. */
155 char signature[NLM_SIGNATURE_SIZE];
156 /* Size of the fixed header. */
157 bfd_size_type fixed_header_size;
158 /* Size of optional prefix for this backend. Some backend may
159 require this to be a function, but so far a constant is OK. This
160 is for a prefix which precedes the standard NLM fixed header. */
161 bfd_size_type optional_prefix_size;
162 /* Architecture. */
163 enum bfd_architecture arch;
164 /* Machine. */
165 unsigned int mach;
166 /* Some NLM formats do not use the uninitialized data section, so
167 all uninitialized data must be put into the regular data section
168 instead. */
169 bfd_boolean no_uninitialized_data;
170 /* Some NLM formats have a prefix on the file. If this function is
171 not NULL, it will be called by nlm_object_p. It should return
172 TRUE if this file could match this format, and it should leave
173 the BFD such that a bfd_bread will pick up the fixed header. */
174 bfd_boolean (*nlm_backend_object_p) PARAMS ((bfd *));
175 /* Write out the prefix. This function may be NULL. This must
176 write out the same number of bytes as is in the field
177 optional_prefix_size. */
178 bfd_boolean (*nlm_write_prefix) PARAMS ((bfd *));
179 /* Read a relocation fixup from abfd. The reloc information is
180 machine specific. The second argument is the symbol if this is
181 an import, or NULL if this is a reloc fixup. This function
182 should set the third argument to the section which the reloc
183 belongs in, and the fourth argument to the reloc itself; it does
184 not need to fill in the sym_ptr_ptr field for a reloc against an
185 import symbol. */
186 bfd_boolean (*nlm_read_reloc)
187 PARAMS ((bfd *, nlmNAME(symbol_type) *, asection **, arelent *));
188 /* To make objcopy to an i386 NLM work, the i386 backend needs a
189 chance to work over the relocs. This is a bit icky. */
190 bfd_boolean (*nlm_mangle_relocs)
191 PARAMS ((bfd *, asection *, PTR data, bfd_vma offset, bfd_size_type count));
192 /* Read an import record from abfd. It would be nice if this
193 were in a machine-dependent format, but it doesn't seem to be. */
194 bfd_boolean (*nlm_read_import) PARAMS ((bfd *, nlmNAME(symbol_type) *));
195 /* Write an import record to abfd. */
196 bfd_boolean (*nlm_write_import) PARAMS ((bfd *, asection *, arelent *));
197 /* Set the section for a public symbol. This may be NULL, in which
198 case a default method will be used. */
199 bfd_boolean (*nlm_set_public_section)
200 PARAMS ((bfd *, nlmNAME(symbol_type) *));
201 /* Get the offset to write out for a public symbol. This may be
202 NULL, in which case a default method will be used. */
203 bfd_vma (*nlm_get_public_offset) PARAMS ((bfd *, asymbol *));
204 /* Swap the fixed header in and out */
205 void (*nlm_swap_fhdr_in)
206 PARAMS ((bfd *, PTR, Nlm_Internal_Fixed_Header *));
207 void (*nlm_swap_fhdr_out)
208 PARAMS ((bfd *, struct nlm_internal_fixed_header *, PTR));
209 /* Write out an external reference. */
210 bfd_boolean (*nlm_write_external)
211 PARAMS ((bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *));
212 bfd_boolean (*nlm_write_export) PARAMS ((bfd *, asymbol *, bfd_vma));
213};
214
215#define nlm_backend(bfd) \
216 ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data))
217#define nlm_signature(bfd) \
218 (nlm_backend(bfd) -> signature)
219#define nlm_fixed_header_size(bfd) \
220 (nlm_backend(bfd) -> fixed_header_size)
221#define nlm_optional_prefix_size(bfd) \
222 (nlm_backend(bfd) -> optional_prefix_size)
223#define nlm_architecture(bfd) \
224 (nlm_backend(bfd) -> arch)
225#define nlm_machine(bfd) \
226 (nlm_backend(bfd) -> mach)
227#define nlm_no_uninitialized_data(bfd) \
228 (nlm_backend(bfd) -> no_uninitialized_data)
229#define nlm_backend_object_p_func(bfd) \
230 (nlm_backend(bfd) -> nlm_backend_object_p)
231#define nlm_write_prefix_func(bfd) \
232 (nlm_backend(bfd) -> nlm_write_prefix)
233#define nlm_read_reloc_func(bfd) \
234 (nlm_backend(bfd) -> nlm_read_reloc)
235#define nlm_mangle_relocs_func(bfd) \
236 (nlm_backend(bfd) -> nlm_mangle_relocs)
237#define nlm_read_import_func(bfd) \
238 (nlm_backend(bfd) -> nlm_read_import)
239#define nlm_write_import_func(bfd) \
240 (nlm_backend(bfd) -> nlm_write_import)
241#define nlm_set_public_section_func(bfd) \
242 (nlm_backend(bfd) -> nlm_set_public_section)
243#define nlm_get_public_offset_func(bfd) \
244 (nlm_backend(bfd) -> nlm_get_public_offset)
245#define nlm_swap_fixed_header_in_func(bfd) \
246 (nlm_backend(bfd) -> nlm_swap_fhdr_in)
247#define nlm_swap_fixed_header_out_func(bfd) \
248 (nlm_backend(bfd) -> nlm_swap_fhdr_out)
249#define nlm_write_external_func(bfd) \
250 (nlm_backend(bfd) -> nlm_write_external)
251#define nlm_write_export_func(bfd) \
252 (nlm_backend(bfd) -> nlm_write_export)
253
254/* The NLM code, data, and uninitialized sections have no names defined
255 in the NLM, but bfd wants to give them names, so use the traditional
256 UNIX names. */
257
258#define NLM_CODE_NAME ".text"
259#define NLM_INITIALIZED_DATA_NAME ".data"
260#define NLM_UNINITIALIZED_DATA_NAME ".bss"
261
262#endif /* _LIBNLM_H_ */
Note: See TracBrowser for help on using the repository browser.