2007-07-03 Markus Deuling <deuling@de.ibm.com>
[deliverable/binutils-gdb.git] / bfd / libnlm.h
CommitLineData
252b5132 1/* BFD back-end data structures for NLM (NetWare Loadable Modules) files.
7920ce38 2 Copyright 1993, 1994, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
252b5132
RH
3 Written by Cygnus Support.
4
7920ce38 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
7920ce38
NC
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
252b5132 11
7920ce38
NC
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
252b5132 16
7920ce38
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
3e110533 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
252b5132
RH
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
7920ce38
NC
55extern bfd_boolean nlm_mkobject (bfd *);
56extern bfd_boolean nlm_set_arch_mach (bfd *, enum bfd_architecture, unsigned long);
57extern void nlmNAME (get_symbol_info) (bfd *, asymbol *, symbol_info *);
58extern long nlmNAME (get_symtab_upper_bound)(bfd *);
59extern long nlmNAME (canonicalize_symtab) (bfd *, asymbol **);
60extern asymbol * nlmNAME (make_empty_symbol) (bfd *);
61extern void nlmNAME (print_symbol) (bfd *, void *, asymbol *, bfd_print_symbol_type);
62extern long nlmNAME (get_reloc_upper_bound) (bfd *, asection *);
63extern long nlmNAME (canonicalize_reloc) (bfd *, asection *, arelent **, asymbol **);
64extern const bfd_target * nlmNAME (object_p) (bfd *);
65extern bfd_boolean nlmNAME (set_arch_mach) (bfd *, enum bfd_architecture, unsigned long);
66extern bfd_boolean nlmNAME (set_section_contents) (bfd *, asection *, const void *, file_ptr, bfd_size_type);
67extern bfd_boolean nlmNAME (write_object_contents) (bfd *);
252b5132
RH
68
69/* Some private data is stashed away for future use using the tdata pointer
70 in the bfd structure. */
71
72struct nlm_obj_tdata
73{
74 /* Actual data, but ref like ptr */
75 Nlm_Internal_Fixed_Header nlm_fixed_hdr[1];
76 Nlm_Internal_Variable_Header nlm_variable_hdr[1];
77 Nlm_Internal_Version_Header nlm_version_hdr[1];
78 Nlm_Internal_Copyright_Header nlm_copyright_hdr[1];
79 Nlm_Internal_Extended_Header nlm_extended_hdr[1];
80 Nlm_Internal_Custom_Header nlm_custom_hdr[1];
81 Nlm_Internal_Cygnus_Ext_Header nlm_cygnus_ext_hdr[1];
82 /* BFD NLM symbols. */
7920ce38 83 nlmNAME (symbol_type) * nlm_symbols;
252b5132
RH
84 /* Lowest text and data VMA values. */
85 bfd_vma nlm_text_low;
86 bfd_vma nlm_data_low;
87 /* Caches for data read from object file. */
88 arelent * nlm_reloc_fixups;
89 asection ** nlm_reloc_fixup_secs;
90 /* Backend specific information. This should probably be a pointer,
91 but that would require yet another entry point to initialize the
92 structure. */
93 union
94 {
95 struct /* Alpha backend information. */
96 {
97 bfd_vma gp; /* GP value. */
98 bfd_vma lita_address; /* .lita section address. */
99 bfd_size_type lita_size; /* .lita section size. */
100 }
101 alpha_backend_data;
102 }
103 backend_data;
104};
105
106#define nlm_tdata(bfd) ((bfd) -> tdata.nlm_obj_data)
7920ce38
NC
107#define nlm_fixed_header(bfd) (nlm_tdata (bfd) -> nlm_fixed_hdr)
108#define nlm_variable_header(bfd) (nlm_tdata (bfd) -> nlm_variable_hdr)
109#define nlm_version_header(bfd) (nlm_tdata (bfd) -> nlm_version_hdr)
110#define nlm_copyright_header(bfd) (nlm_tdata (bfd) -> nlm_copyright_hdr)
111#define nlm_extended_header(bfd) (nlm_tdata (bfd) -> nlm_extended_hdr)
112#define nlm_custom_header(bfd) (nlm_tdata (bfd) -> nlm_custom_hdr)
113#define nlm_cygnus_ext_header(bfd) (nlm_tdata (bfd) -> nlm_cygnus_ext_hdr)
114#define nlm_get_symbols(bfd) (nlm_tdata (bfd) -> nlm_symbols)
115#define nlm_set_symbols(bfd, p) (nlm_tdata (bfd) -> nlm_symbols = (p))
116#define nlm_set_text_low(bfd, i) (nlm_tdata (bfd) -> nlm_text_low = (i))
117#define nlm_get_text_low(bfd) (nlm_tdata (bfd) -> nlm_text_low)
118#define nlm_set_data_low(bfd, i) (nlm_tdata (bfd) -> nlm_data_low = (i))
119#define nlm_get_data_low(bfd) (nlm_tdata (bfd) -> nlm_data_low)
120#define nlm_relocation_fixups(bfd) (nlm_tdata (bfd) -> nlm_reloc_fixups)
121#define nlm_relocation_fixup_secs(bfd) (nlm_tdata (bfd) -> nlm_reloc_fixup_secs)
122#define nlm_alpha_backend_data(bfd) (&nlm_tdata (bfd) -> backend_data.alpha_backend_data)
252b5132
RH
123
124/* This is used when writing out the external relocs. */
125
126struct reloc_and_sec
127{
128 arelent *rel;
129 asection *sec;
130};
131
132/* We store some function pointer in the backend structure. This lets
133 different NLM targets share most of the same code, while providing
134 slightly different code where necessary. */
135
136struct nlm_backend_data
137{
138 /* Signature for this backend. */
139 char signature[NLM_SIGNATURE_SIZE];
140 /* Size of the fixed header. */
141 bfd_size_type fixed_header_size;
142 /* Size of optional prefix for this backend. Some backend may
143 require this to be a function, but so far a constant is OK. This
144 is for a prefix which precedes the standard NLM fixed header. */
145 bfd_size_type optional_prefix_size;
146 /* Architecture. */
147 enum bfd_architecture arch;
148 /* Machine. */
dc810e39 149 unsigned int mach;
252b5132
RH
150 /* Some NLM formats do not use the uninitialized data section, so
151 all uninitialized data must be put into the regular data section
152 instead. */
b34976b6 153 bfd_boolean no_uninitialized_data;
252b5132
RH
154 /* Some NLM formats have a prefix on the file. If this function is
155 not NULL, it will be called by nlm_object_p. It should return
b34976b6 156 TRUE if this file could match this format, and it should leave
dc810e39 157 the BFD such that a bfd_bread will pick up the fixed header. */
7920ce38 158 bfd_boolean (*nlm_backend_object_p) (bfd *);
252b5132
RH
159 /* Write out the prefix. This function may be NULL. This must
160 write out the same number of bytes as is in the field
161 optional_prefix_size. */
7920ce38 162 bfd_boolean (*nlm_write_prefix) (bfd *);
252b5132
RH
163 /* Read a relocation fixup from abfd. The reloc information is
164 machine specific. The second argument is the symbol if this is
165 an import, or NULL if this is a reloc fixup. This function
166 should set the third argument to the section which the reloc
167 belongs in, and the fourth argument to the reloc itself; it does
168 not need to fill in the sym_ptr_ptr field for a reloc against an
169 import symbol. */
7920ce38 170 bfd_boolean (*nlm_read_reloc) (bfd *, nlmNAME (symbol_type) *, asection **, arelent *);
252b5132
RH
171 /* To make objcopy to an i386 NLM work, the i386 backend needs a
172 chance to work over the relocs. This is a bit icky. */
7920ce38 173 bfd_boolean (*nlm_mangle_relocs) (bfd *, asection *, const void *, bfd_vma, bfd_size_type);
252b5132
RH
174 /* Read an import record from abfd. It would be nice if this
175 were in a machine-dependent format, but it doesn't seem to be. */
7920ce38 176 bfd_boolean (*nlm_read_import) (bfd *, nlmNAME (symbol_type) *);
252b5132 177 /* Write an import record to abfd. */
7920ce38 178 bfd_boolean (*nlm_write_import) (bfd *, asection *, arelent *);
252b5132
RH
179 /* Set the section for a public symbol. This may be NULL, in which
180 case a default method will be used. */
7920ce38 181 bfd_boolean (*nlm_set_public_section) (bfd *, nlmNAME (symbol_type) *);
252b5132
RH
182 /* Get the offset to write out for a public symbol. This may be
183 NULL, in which case a default method will be used. */
7920ce38 184 bfd_vma (*nlm_get_public_offset) (bfd *, asymbol *);
252b5132 185 /* Swap the fixed header in and out */
7920ce38
NC
186 void (*nlm_swap_fhdr_in) (bfd *, void *, Nlm_Internal_Fixed_Header *);
187 void (*nlm_swap_fhdr_out) (bfd *, struct nlm_internal_fixed_header *, void *);
252b5132 188 /* Write out an external reference. */
7920ce38
NC
189 bfd_boolean (*nlm_write_external) (bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *);
190 bfd_boolean (*nlm_write_export) (bfd *, asymbol *, bfd_vma);
252b5132
RH
191};
192
7920ce38
NC
193#define nlm_backend(bfd) ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data))
194#define nlm_signature(bfd) (nlm_backend (bfd) -> signature)
195#define nlm_fixed_header_size(bfd) (nlm_backend (bfd) -> fixed_header_size)
196#define nlm_optional_prefix_size(bfd) (nlm_backend (bfd) -> optional_prefix_size)
197#define nlm_architecture(bfd) (nlm_backend (bfd) -> arch)
198#define nlm_machine(bfd) (nlm_backend (bfd) -> mach)
199#define nlm_no_uninitialized_data(bfd) (nlm_backend (bfd) -> no_uninitialized_data)
200#define nlm_backend_object_p_func(bfd) (nlm_backend (bfd) -> nlm_backend_object_p)
201#define nlm_write_prefix_func(bfd) (nlm_backend (bfd) -> nlm_write_prefix)
202#define nlm_read_reloc_func(bfd) (nlm_backend (bfd) -> nlm_read_reloc)
203#define nlm_mangle_relocs_func(bfd) (nlm_backend (bfd) -> nlm_mangle_relocs)
204#define nlm_read_import_func(bfd) (nlm_backend (bfd) -> nlm_read_import)
205#define nlm_write_import_func(bfd) (nlm_backend (bfd) -> nlm_write_import)
206#define nlm_set_public_section_func(bfd) (nlm_backend (bfd) -> nlm_set_public_section)
207#define nlm_get_public_offset_func(bfd) (nlm_backend (bfd) -> nlm_get_public_offset)
208#define nlm_swap_fixed_header_in_func(bfd) (nlm_backend (bfd) -> nlm_swap_fhdr_in)
209#define nlm_swap_fixed_header_out_func(bfd)(nlm_backend (bfd) -> nlm_swap_fhdr_out)
210#define nlm_write_external_func(bfd) (nlm_backend (bfd) -> nlm_write_external)
211#define nlm_write_export_func(bfd) (nlm_backend (bfd) -> nlm_write_export)
252b5132
RH
212
213/* The NLM code, data, and uninitialized sections have no names defined
214 in the NLM, but bfd wants to give them names, so use the traditional
215 UNIX names. */
216
217#define NLM_CODE_NAME ".text"
218#define NLM_INITIALIZED_DATA_NAME ".data"
219#define NLM_UNINITIALIZED_DATA_NAME ".bss"
220
221#endif /* _LIBNLM_H_ */
This page took 0.441422 seconds and 4 git commands to generate.