123 lines
4.0 KiB
C
123 lines
4.0 KiB
C
/* AVR-specific support for 32-bit ELF.
|
|
Copyright (C) 2006-2020 Free Software Foundation, Inc.
|
|
|
|
Written by Bjoern Haase <bjoern.m.haase@web.de>
|
|
|
|
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 3 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. */
|
|
|
|
|
|
/* These four functions will be called from the ld back-end. */
|
|
|
|
extern void
|
|
elf32_avr_setup_params (struct bfd_link_info *, bfd *, asection *,
|
|
bfd_boolean, bfd_boolean, bfd_boolean,
|
|
bfd_vma, bfd_boolean);
|
|
|
|
extern int
|
|
elf32_avr_setup_section_lists (bfd *, struct bfd_link_info *);
|
|
|
|
extern bfd_boolean
|
|
elf32_avr_size_stubs (bfd *, struct bfd_link_info *, bfd_boolean);
|
|
|
|
extern bfd_boolean
|
|
elf32_avr_build_stubs (struct bfd_link_info *);
|
|
|
|
/* The name of the section into which the property records are stored. */
|
|
#define AVR_PROPERTY_RECORD_SECTION_NAME ".avr.prop"
|
|
|
|
/* The current version number for the format of the property records. */
|
|
#define AVR_PROPERTY_RECORDS_VERSION 1
|
|
|
|
/* The size of the header that is written to the property record section
|
|
before the property records are written out. */
|
|
#define AVR_PROPERTY_SECTION_HEADER_SIZE 4
|
|
|
|
/* This holds a single property record in memory, the structure of this
|
|
data when written out to the ELF section is more compressed. */
|
|
|
|
struct avr_property_record
|
|
{
|
|
/* The section and offset for this record. */
|
|
asection *section;
|
|
bfd_vma offset;
|
|
|
|
/* The type of this record. */
|
|
enum {
|
|
RECORD_ORG = 0,
|
|
RECORD_ORG_AND_FILL = 1,
|
|
RECORD_ALIGN = 2,
|
|
RECORD_ALIGN_AND_FILL = 3
|
|
} type;
|
|
|
|
/* Type specific data. */
|
|
union
|
|
{
|
|
/* RECORD_ORG and RECORD_ORG_AND_FILL. */
|
|
struct
|
|
{
|
|
unsigned long fill;
|
|
} org;
|
|
|
|
/* RECORD_ALIGN and RECORD_ALIGN_AND_FILL. */
|
|
struct
|
|
{
|
|
unsigned long bytes;
|
|
unsigned long fill;
|
|
|
|
/* This field is used during linker relaxation to track the number of
|
|
bytes that have been opened up before this alignment directive.
|
|
When we have enough bytes available it is possible to move the
|
|
re-align this directive backwards while still maintaining the
|
|
alignment requirement. */
|
|
unsigned long preceding_deleted;
|
|
} align;
|
|
} data;
|
|
};
|
|
|
|
struct avr_property_record_list
|
|
{
|
|
/* The version number tells us the structure of the property record data
|
|
within the section. See AVR_PROPERTY_RECORDS_VERSION. */
|
|
bfd_byte version;
|
|
|
|
/* The flags field is currently unused. This should be set to 0. */
|
|
bfd_byte flags;
|
|
|
|
/* The number of property records. This is stored as a 2-byte value in
|
|
the section contents. */
|
|
unsigned long record_count;
|
|
|
|
/* The section from which the property records were loaded. This is the
|
|
actual section containing the records, not the section(s) to which the
|
|
records apply. */
|
|
asection *section;
|
|
|
|
/* The actual property records. */
|
|
struct avr_property_record *records;
|
|
};
|
|
|
|
/* Load the property records from ABFD, return NULL if there are non
|
|
found, otherwise return pointer to dynamically allocated memory. The
|
|
memory for the header and all of the records are allocated in a single
|
|
block, as such only the header needs to be freed. */
|
|
|
|
extern struct avr_property_record_list *avr_elf32_load_property_records (bfd *abfd);
|
|
|
|
/* Return a string that is the name of the property record pointed to by REC. */
|
|
extern const char *avr_elf32_property_record_name (struct avr_property_record *rec);
|