Copyright 1993, 1994, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef _LIBNLM_H_
#define _LIBNLM_H_ 1
#ifdef ARCH_SIZE
# define NLM_ARCH_SIZE ARCH_SIZE
#endif
#include "nlm/common.h"
#include "nlm/internal.h"
#include "nlm/external.h"
with sections, and include a symbol. These relocs are associated
with (undefined) symbols, and include a section. */
struct nlm_relent
{
asection *section;
arelent reloc;
};
typedef struct
{
asymbol symbol;
bfd_size_type rcnt;
struct nlm_relent *relocs;
} nlmNAME(symbol_type);
extern bfd_boolean nlm_mkobject (bfd *);
extern bfd_boolean nlm_set_arch_mach (bfd *, enum bfd_architecture, unsigned long);
extern void nlmNAME (get_symbol_info) (bfd *, asymbol *, symbol_info *);
extern long nlmNAME (get_symtab_upper_bound)(bfd *);
extern long nlmNAME (canonicalize_symtab) (bfd *, asymbol **);
extern asymbol * nlmNAME (make_empty_symbol) (bfd *);
extern void nlmNAME (print_symbol) (bfd *, void *, asymbol *, bfd_print_symbol_type);
extern long nlmNAME (get_reloc_upper_bound) (bfd *, asection *);
extern long nlmNAME (canonicalize_reloc) (bfd *, asection *, arelent **, asymbol **);
extern const bfd_target * nlmNAME (object_p) (bfd *);
extern bfd_boolean nlmNAME (set_arch_mach) (bfd *, enum bfd_architecture, unsigned long);
extern bfd_boolean nlmNAME (set_section_contents) (bfd *, asection *, const void *, file_ptr, bfd_size_type);
extern bfd_boolean nlmNAME (write_object_contents) (bfd *);
in the bfd structure. */
struct nlm_obj_tdata
{
Nlm_Internal_Fixed_Header nlm_fixed_hdr[1];
Nlm_Internal_Variable_Header nlm_variable_hdr[1];
Nlm_Internal_Version_Header nlm_version_hdr[1];
Nlm_Internal_Copyright_Header nlm_copyright_hdr[1];
Nlm_Internal_Extended_Header nlm_extended_hdr[1];
Nlm_Internal_Custom_Header nlm_custom_hdr[1];
Nlm_Internal_Cygnus_Ext_Header nlm_cygnus_ext_hdr[1];
nlmNAME (symbol_type) * nlm_symbols;
bfd_vma nlm_text_low;
bfd_vma nlm_data_low;
arelent * nlm_reloc_fixups;
asection ** nlm_reloc_fixup_secs;
but that would require yet another entry point to initialize the
structure. */
union
{
struct
{
bfd_vma gp;
bfd_vma lita_address;
bfd_size_type lita_size;
}
alpha_backend_data;
}
backend_data;
};
#define nlm_tdata(bfd) ((bfd) -> tdata.nlm_obj_data)
#define nlm_fixed_header(bfd) (nlm_tdata (bfd) -> nlm_fixed_hdr)
#define nlm_variable_header(bfd) (nlm_tdata (bfd) -> nlm_variable_hdr)
#define nlm_version_header(bfd) (nlm_tdata (bfd) -> nlm_version_hdr)
#define nlm_copyright_header(bfd) (nlm_tdata (bfd) -> nlm_copyright_hdr)
#define nlm_extended_header(bfd) (nlm_tdata (bfd) -> nlm_extended_hdr)
#define nlm_custom_header(bfd) (nlm_tdata (bfd) -> nlm_custom_hdr)
#define nlm_cygnus_ext_header(bfd) (nlm_tdata (bfd) -> nlm_cygnus_ext_hdr)
#define nlm_get_symbols(bfd) (nlm_tdata (bfd) -> nlm_symbols)
#define nlm_set_symbols(bfd, p) (nlm_tdata (bfd) -> nlm_symbols = (p))
#define nlm_set_text_low(bfd, i) (nlm_tdata (bfd) -> nlm_text_low = (i))
#define nlm_get_text_low(bfd) (nlm_tdata (bfd) -> nlm_text_low)
#define nlm_set_data_low(bfd, i) (nlm_tdata (bfd) -> nlm_data_low = (i))
#define nlm_get_data_low(bfd) (nlm_tdata (bfd) -> nlm_data_low)
#define nlm_relocation_fixups(bfd) (nlm_tdata (bfd) -> nlm_reloc_fixups)
#define nlm_relocation_fixup_secs(bfd) (nlm_tdata (bfd) -> nlm_reloc_fixup_secs)
#define nlm_alpha_backend_data(bfd) (&nlm_tdata (bfd) -> backend_data.alpha_backend_data)
struct reloc_and_sec
{
arelent *rel;
asection *sec;
};
different NLM targets share most of the same code, while providing
slightly different code where necessary. */
struct nlm_backend_data
{
char signature[NLM_SIGNATURE_SIZE];
bfd_size_type fixed_header_size;
require this to be a function, but so far a constant is OK. This
is for a prefix which precedes the standard NLM fixed header. */
bfd_size_type optional_prefix_size;
enum bfd_architecture arch;
unsigned int mach;
all uninitialized data must be put into the regular data section
instead. */
bfd_boolean no_uninitialized_data;
not NULL, it will be called by nlm_object_p. It should return
TRUE if this file could match this format, and it should leave
the BFD such that a bfd_bread will pick up the fixed header. */
bfd_boolean (*nlm_backend_object_p) (bfd *);
write out the same number of bytes as is in the field
optional_prefix_size. */
bfd_boolean (*nlm_write_prefix) (bfd *);
machine specific. The second argument is the symbol if this is
an import, or NULL if this is a reloc fixup. This function
should set the third argument to the section which the reloc
belongs in, and the fourth argument to the reloc itself; it does
not need to fill in the sym_ptr_ptr field for a reloc against an
import symbol. */
bfd_boolean (*nlm_read_reloc) (bfd *, nlmNAME (symbol_type) *, asection **, arelent *);
chance to work over the relocs. This is a bit icky. */
bfd_boolean (*nlm_mangle_relocs) (bfd *, asection *, const void *, bfd_vma, bfd_size_type);
were in a machine-dependent format, but it doesn't seem to be. */
bfd_boolean (*nlm_read_import) (bfd *, nlmNAME (symbol_type) *);
bfd_boolean (*nlm_write_import) (bfd *, asection *, arelent *);
case a default method will be used. */
bfd_boolean (*nlm_set_public_section) (bfd *, nlmNAME (symbol_type) *);
NULL, in which case a default method will be used. */
bfd_vma (*nlm_get_public_offset) (bfd *, asymbol *);
void (*nlm_swap_fhdr_in) (bfd *, void *, Nlm_Internal_Fixed_Header *);
void (*nlm_swap_fhdr_out) (bfd *, struct nlm_internal_fixed_header *, void *);
bfd_boolean (*nlm_write_external) (bfd *, bfd_size_type, asymbol *, struct reloc_and_sec *);
bfd_boolean (*nlm_write_export) (bfd *, asymbol *, bfd_vma);
};
#define nlm_backend(bfd) ((struct nlm_backend_data *)((bfd) -> xvec -> backend_data))
#define nlm_signature(bfd) (nlm_backend (bfd) -> signature)
#define nlm_fixed_header_size(bfd) (nlm_backend (bfd) -> fixed_header_size)
#define nlm_optional_prefix_size(bfd) (nlm_backend (bfd) -> optional_prefix_size)
#define nlm_architecture(bfd) (nlm_backend (bfd) -> arch)
#define nlm_machine(bfd) (nlm_backend (bfd) -> mach)
#define nlm_no_uninitialized_data(bfd) (nlm_backend (bfd) -> no_uninitialized_data)
#define nlm_backend_object_p_func(bfd) (nlm_backend (bfd) -> nlm_backend_object_p)
#define nlm_write_prefix_func(bfd) (nlm_backend (bfd) -> nlm_write_prefix)
#define nlm_read_reloc_func(bfd) (nlm_backend (bfd) -> nlm_read_reloc)
#define nlm_mangle_relocs_func(bfd) (nlm_backend (bfd) -> nlm_mangle_relocs)
#define nlm_read_import_func(bfd) (nlm_backend (bfd) -> nlm_read_import)
#define nlm_write_import_func(bfd) (nlm_backend (bfd) -> nlm_write_import)
#define nlm_set_public_section_func(bfd) (nlm_backend (bfd) -> nlm_set_public_section)
#define nlm_get_public_offset_func(bfd) (nlm_backend (bfd) -> nlm_get_public_offset)
#define nlm_swap_fixed_header_in_func(bfd) (nlm_backend (bfd) -> nlm_swap_fhdr_in)
#define nlm_swap_fixed_header_out_func(bfd)(nlm_backend (bfd) -> nlm_swap_fhdr_out)
#define nlm_write_external_func(bfd) (nlm_backend (bfd) -> nlm_write_external)
#define nlm_write_export_func(bfd) (nlm_backend (bfd) -> nlm_write_export)
in the NLM, but bfd wants to give them names, so use the traditional
UNIX names. */
#define NLM_CODE_NAME ".text"
#define NLM_INITIALIZED_DATA_NAME ".data"
#define NLM_UNINITIALIZED_DATA_NAME ".bss"
#endif