1999-05-03 09:29:11 +02:00
|
|
|
/* ldlang.h - linker command language support
|
2020-01-01 08:57:01 +01:00
|
|
|
Copyright (C) 1991-2020 Free Software Foundation, Inc.
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2007-07-06 16:09:45 +02:00
|
|
|
This file is part of the GNU Binutils.
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2007-07-06 16:09:45 +02:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
1999-05-03 09:29:11 +02:00
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-07-06 16:09:45 +02:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2007-07-06 16:09:45 +02:00
|
|
|
This program is distributed in the hope that it will be useful,
|
1999-05-03 09:29:11 +02:00
|
|
|
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.
|
2000-09-29 15:21:41 +02:00
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
You should have received a copy of the GNU General Public License
|
2007-07-06 16:09:45 +02:00
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
MA 02110-1301, USA. */
|
1999-05-03 09:29:11 +02:00
|
|
|
|
|
|
|
#ifndef LDLANG_H
|
|
|
|
#define LDLANG_H
|
|
|
|
|
2003-10-21 17:33:47 +02:00
|
|
|
#define DEFAULT_MEMORY_REGION "*default*"
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef enum
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_input_file_is_l_enum,
|
|
|
|
lang_input_file_is_symbols_only_enum,
|
|
|
|
lang_input_file_is_marker_enum,
|
|
|
|
lang_input_file_is_fake_enum,
|
|
|
|
lang_input_file_is_search_file_enum,
|
|
|
|
lang_input_file_is_file_enum
|
|
|
|
} lang_input_file_enum_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
struct _fill_type
|
|
|
|
{
|
2002-02-15 03:11:05 +01:00
|
|
|
size_t size;
|
|
|
|
unsigned char data[1];
|
|
|
|
};
|
2000-10-09 17:09:17 +02:00
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct statement_list
|
|
|
|
{
|
2009-03-02 18:27:36 +01:00
|
|
|
union lang_statement_union * head;
|
|
|
|
union lang_statement_union ** tail;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_statement_list_type;
|
|
|
|
|
2009-03-02 18:27:36 +01:00
|
|
|
typedef struct memory_region_name_struct
|
|
|
|
{
|
|
|
|
const char * name;
|
|
|
|
struct memory_region_name_struct * next;
|
|
|
|
} lang_memory_region_name;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct memory_region_struct
|
|
|
|
{
|
2009-03-02 18:27:36 +01:00
|
|
|
lang_memory_region_name name_list;
|
1999-05-03 09:29:11 +02:00
|
|
|
struct memory_region_struct *next;
|
2015-01-28 05:31:50 +01:00
|
|
|
union etree_union *origin_exp;
|
1999-05-03 09:29:11 +02:00
|
|
|
bfd_vma origin;
|
|
|
|
bfd_size_type length;
|
2015-01-28 05:31:50 +01:00
|
|
|
union etree_union *length_exp;
|
1999-05-03 09:29:11 +02:00
|
|
|
bfd_vma current;
|
2006-07-26 07:05:52 +02:00
|
|
|
union lang_statement_union *last_os;
|
1999-05-03 09:29:11 +02:00
|
|
|
flagword flags;
|
|
|
|
flagword not_flags;
|
2002-11-30 09:39:46 +01:00
|
|
|
bfd_boolean had_full_message;
|
2000-10-09 17:09:17 +02:00
|
|
|
} lang_memory_region_type;
|
|
|
|
|
2009-09-11 17:27:38 +02:00
|
|
|
enum statement_enum
|
|
|
|
{
|
|
|
|
lang_address_statement_enum,
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_assignment_statement_enum,
|
2009-09-11 17:27:38 +02:00
|
|
|
lang_data_statement_enum,
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_fill_statement_enum,
|
2009-09-11 17:27:38 +02:00
|
|
|
lang_group_statement_enum,
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_input_section_enum,
|
|
|
|
lang_input_statement_enum,
|
2009-09-11 17:27:38 +02:00
|
|
|
lang_insert_statement_enum,
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_output_section_statement_enum,
|
|
|
|
lang_output_statement_enum,
|
|
|
|
lang_padding_statement_enum,
|
|
|
|
lang_reloc_statement_enum,
|
|
|
|
lang_target_statement_enum,
|
|
|
|
lang_wild_statement_enum,
|
|
|
|
lang_constructors_statement_enum,
|
|
|
|
lang_object_symbols_statement_enum
|
2009-09-11 17:27:38 +02:00
|
|
|
};
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_statement_header_struct
|
|
|
|
{
|
2018-11-29 14:42:49 +01:00
|
|
|
/* Next pointer for statement_list statement list. */
|
2000-10-09 17:09:17 +02:00
|
|
|
union lang_statement_union *next;
|
2009-09-11 17:27:38 +02:00
|
|
|
enum statement_enum type;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_statement_header_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
union etree_union *exp;
|
|
|
|
} lang_assignment_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_target_statement_struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
const char *target;
|
|
|
|
} lang_target_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_output_statement_struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
const char *name;
|
|
|
|
} lang_output_statement_type;
|
|
|
|
|
|
|
|
/* Section types specified in a linker script. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
enum section_type
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
normal_section,
|
2019-07-10 16:05:18 +02:00
|
|
|
first_overlay_section,
|
2007-04-18 05:55:10 +02:00
|
|
|
overlay_section,
|
1999-05-03 09:29:11 +02:00
|
|
|
noload_section,
|
2006-06-07 06:55:11 +02:00
|
|
|
noalloc_section
|
1999-05-03 09:29:11 +02:00
|
|
|
};
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
/* This structure holds a list of program headers describing
|
|
|
|
segments in which this section should be placed. */
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_output_section_phdr_list
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
struct lang_output_section_phdr_list *next;
|
|
|
|
const char *name;
|
2002-11-30 09:39:46 +01:00
|
|
|
bfd_boolean used;
|
2004-01-13 12:10:53 +01:00
|
|
|
} lang_output_section_phdr_list;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_output_section_statement_struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
lang_statement_list_type children;
|
2004-10-14 14:54:47 +02:00
|
|
|
struct lang_output_section_statement_struct *next;
|
2005-12-24 08:48:30 +01:00
|
|
|
struct lang_output_section_statement_struct *prev;
|
1999-05-03 09:29:11 +02:00
|
|
|
const char *name;
|
|
|
|
asection *bfd_section;
|
2004-01-13 12:10:53 +01:00
|
|
|
lang_memory_region_type *region;
|
|
|
|
lang_memory_region_type *lma_region;
|
2002-02-15 03:11:05 +01:00
|
|
|
fill_type *fill;
|
2005-11-03 03:54:10 +01:00
|
|
|
union etree_union *addr_tree;
|
1999-05-03 09:29:11 +02:00
|
|
|
union etree_union *load_base;
|
2018-08-26 06:53:38 +02:00
|
|
|
union etree_union *section_alignment;
|
|
|
|
union etree_union *subsection_alignment;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2002-05-07 13:04:54 +02:00
|
|
|
/* If non-null, an expression to evaluate after setting the section's
|
|
|
|
size. The expression is evaluated inside REGION (above) with '.'
|
|
|
|
set to the end of the section. Used in the last overlay section
|
|
|
|
to move '.' past all the overlaid sections. */
|
|
|
|
union etree_union *update_dot_tree;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
lang_output_section_phdr_list *phdrs;
|
2005-11-03 03:54:10 +01:00
|
|
|
|
|
|
|
unsigned int block_value;
|
|
|
|
int constraint;
|
|
|
|
flagword flags;
|
|
|
|
enum section_type sectype;
|
2006-08-16 10:31:45 +02:00
|
|
|
unsigned int processed_vma : 1;
|
|
|
|
unsigned int processed_lma : 1;
|
2005-11-03 03:54:10 +01:00
|
|
|
unsigned int all_input_readonly : 1;
|
2006-09-27 06:18:16 +02:00
|
|
|
/* If this section should be ignored. */
|
2013-01-10 21:08:03 +01:00
|
|
|
unsigned int ignored : 1;
|
2012-05-30 06:19:11 +02:00
|
|
|
/* If this section should update "dot". Prevents section being ignored. */
|
2013-01-10 21:08:03 +01:00
|
|
|
unsigned int update_dot : 1;
|
2012-06-15 17:13:41 +02:00
|
|
|
/* If this section is after assignment to _end. */
|
|
|
|
unsigned int after_end : 1;
|
2013-07-19 12:39:51 +02:00
|
|
|
/* If this section uses the alignment of its input sections. */
|
|
|
|
unsigned int align_lma_with_input : 1;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_output_section_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
2002-02-15 03:11:05 +01:00
|
|
|
fill_type *fill;
|
1999-05-03 09:29:11 +02:00
|
|
|
int size;
|
|
|
|
asection *output_section;
|
|
|
|
} lang_fill_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
unsigned int type;
|
2000-10-09 17:09:17 +02:00
|
|
|
union etree_union *exp;
|
1999-05-03 09:29:11 +02:00
|
|
|
bfd_vma value;
|
|
|
|
asection *output_section;
|
2005-11-03 03:54:10 +01:00
|
|
|
bfd_vma output_offset;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_data_statement_type;
|
|
|
|
|
|
|
|
/* Generate a reloc in the output file. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
|
|
|
|
/* Reloc to generate. */
|
|
|
|
bfd_reloc_code_real_type reloc;
|
|
|
|
|
|
|
|
/* Reloc howto structure. */
|
|
|
|
reloc_howto_type *howto;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
/* Section to generate reloc against.
|
|
|
|
Exactly one of section and name must be NULL. */
|
1999-05-03 09:29:11 +02:00
|
|
|
asection *section;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
/* Name of symbol to generate reloc against.
|
|
|
|
Exactly one of section and name must be NULL. */
|
1999-05-03 09:29:11 +02:00
|
|
|
const char *name;
|
|
|
|
|
|
|
|
/* Expression for addend. */
|
|
|
|
union etree_union *addend_exp;
|
|
|
|
|
|
|
|
/* Resolved addend. */
|
|
|
|
bfd_vma addend_value;
|
|
|
|
|
|
|
|
/* Output section where reloc should be performed. */
|
|
|
|
asection *output_section;
|
|
|
|
|
2005-11-03 03:54:10 +01:00
|
|
|
/* Offset within output section. */
|
|
|
|
bfd_vma output_offset;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_reloc_statement_type;
|
|
|
|
|
2012-03-05 23:43:40 +01:00
|
|
|
struct lang_input_statement_flags
|
2004-01-13 12:10:53 +01:00
|
|
|
{
|
2012-03-05 23:43:40 +01:00
|
|
|
/* 1 means this file was specified in a -l option. */
|
2010-12-06 01:07:06 +01:00
|
|
|
unsigned int maybe_archive : 1;
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2014-03-14 01:55:59 +01:00
|
|
|
/* 1 means this file was specified in a -l:namespec option. */
|
|
|
|
unsigned int full_name_provided : 1;
|
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
/* 1 means search a set of directories for this file. */
|
2012-03-05 23:43:40 +01:00
|
|
|
unsigned int search_dirs : 1;
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2012-03-08 06:29:33 +01:00
|
|
|
/* 1 means this was found when processing a script in the sysroot. */
|
2006-06-09 03:13:39 +02:00
|
|
|
unsigned int sysrooted : 1;
|
2003-03-03 21:00:35 +01:00
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
/* 1 means this is base file of incremental load.
|
|
|
|
Do not load this file's text or data.
|
2000-09-29 15:21:41 +02:00
|
|
|
Also default text_start to after this file's bss. */
|
2012-03-05 23:43:40 +01:00
|
|
|
unsigned int just_syms : 1;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
|
|
|
/* Whether to search for this entry as a dynamic archive. */
|
2006-06-09 03:13:39 +02:00
|
|
|
unsigned int dynamic : 1;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2011-09-20 06:58:56 +02:00
|
|
|
/* Set if a DT_NEEDED tag should be added not just for the dynamic library
|
|
|
|
explicitly given by this entry but also for any dynamic libraries in
|
|
|
|
this entry's needed list. */
|
2009-11-05 16:35:50 +01:00
|
|
|
unsigned int add_DT_NEEDED_for_dynamic : 1;
|
2004-07-19 18:40:52 +02:00
|
|
|
|
2011-09-20 06:58:56 +02:00
|
|
|
/* Set if this entry should cause a DT_NEEDED tag only when some
|
|
|
|
regular file references its symbols (ie. --as-needed is in effect). */
|
2009-11-05 16:35:50 +01:00
|
|
|
unsigned int add_DT_NEEDED_for_regular : 1;
|
2004-03-18 13:50:20 +01:00
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
/* Whether to include the entire contents of an archive. */
|
2006-06-09 03:13:39 +02:00
|
|
|
unsigned int whole_archive : 1;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2010-01-21 11:31:32 +01:00
|
|
|
/* Set when bfd opening is successful. */
|
2006-06-09 03:13:39 +02:00
|
|
|
unsigned int loaded : 1;
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2006-06-09 03:13:39 +02:00
|
|
|
unsigned int real : 1;
|
2010-01-21 11:31:32 +01:00
|
|
|
|
|
|
|
/* Set if the file does not exist. */
|
|
|
|
unsigned int missing_file : 1;
|
Applied patch series for LD plugin interface (six parts).
[PATCH] Add infrastructure for plugin API; functionality to follow.
include/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* plugin-api.h (LDPT_GNU_LD_VERSION): New ld_plugin_tag enum member.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* configure.in: Add AC_CHECKs for file io and dlfcn headers and
functions and AC_SEARCH for -ldl.
(enable_plugins): New shell variable set if above tests find dlopen
functionality.
(ENABLE_PLUGINS): Add related automake conditional.
* configure: Regenerate.
* config.in: Likewise.
* Makefile.am (PLUGIN_C): Declare plugin C source file, conditional
on ENABLE_PLUGINS being defined.
(PLUGIN_H): Likewise for header file.
(PLUGIN_OBJECT): Likewise for object file.
(PLUGIN_CFLAGS): Likewise -D flag required to compile plugin support.
(AM_CPPFLAGS): Use PLUGIN_CFLAGS.
(CFILES): Use PLUGIN_C.
(HFILES): Use PLUGIN_H.
(OFILES): Use PLUGIN_OBJECT.
(ld_new_SOURCES): Use PLUGIN_C.
(noinst_LTLIBRARIES)[ENABLE_PLUGINS]: Declare test plugin.
(libldtestplug_la_SOURCES)[ENABLE_PLUGINS]: Add automake definition
for test plugin.
(libldtestplug_la_CFLAGS)[ENABLE_PLUGINS]: Likewise.
(libldtestplug_la_LDFLAGS)[ENABLE_PLUGINS]: Likewise.
* Makefile.in: Regenerate.
* sysdep.h: Include stdarg.h, unistd.h and one of fcntl.h or
sys/file.h where available. Include dlfcn.h when ENABLE_PLUGINS.
(O_RDONLY): Supply default definition likewise to bfd's sysdep.h
(O_WRONLY): Likewise.
(O_RDWR): Likewise.
(O_ACCMODE): Likewise.
(O_BINARY): Likewise.
(SEEK_SET): Likewise.
(SEEK_CUR): Likewise.
(SEEK_END): Likewise.
* ldmisc.c (vfinfo): Make non-static. Add %p format char.
* ldmisc.h (vfinfo): Declare extern prototype.
* lexsup.c (enum option_values)[ENABLE_PLUGINS]: Add new entries for
OPTION_PLUGIN and OPTION_PLUGIN_OPT.
(ld_options[])[ENABLE_PLUGINS]: Add option data for the above two.
(parse_args)[ENABLE_PLUGINS]: Handle them, and load all plugins once
option parsing is complete.
* ldmain.c (main)[ENABLE_PLUGINS]: Call plugin cleanup hooks just
after lang_finish.
* plugin.c: New source file.
* plugin.h: Likewise new header.
* testplug.c: New source file.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* ld-bootstrap/bootstrap.exp: Skip static tests also if LD plugins
are enabled.
* lib/ld-lib.exp (proc regexp_diff): Extend verbose debug output.
(proc set_file_contents): Write a file with the supplied content.
(run_ld_link_tests): Add new 'ld' action to test linker output.
(proc check_plugin_api_available): Return true if linker under test
supports the plugin API.
* ld-plugin/func.c: New test source file.
* ld-plugin/main.c: Likewise.
* ld-plugin/text.c: Likewise.
* ld-plugin/plugin-1.d: New dump test output pattern script.
* ld-plugin/plugin-2.d: Likewise.
* ld-plugin/plugin-3.d: Likewise.
* ld-plugin/plugin-4.d: Likewise.
* ld-plugin/plugin-5.d: Likewise.
* ld-plugin/plugin.exp: New test control script.
---
[PATCH] Implement claim file and all symbols read hooks and add symbols callback.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 2/6).
* ldfile.c (ldfile_try_open_bfd)[ENABLE_PLUGINS]: Don't return early
during compat checks if they pass, instead offer any successfully
opened and accepted file to the plugin claim file hooks chain. Create
a dummy bfd to accept symbols added by the plugin, if the plugin
claims the file.
* ldlang.c (lang_process)[ENABLE_PLUGINS]: Call plugin all symbols
read hook chain before ldemul_after_open.
* ldlang.h (struct lang_input_statement_struct): Add new single-bit
'claimed' flag.
* plugin.c (IRONLY_SUFFIX): New macro for dummy bfd file suffix.
(IRONLY_SUFFIX_LEN): Length of the above string.
(plugin_get_ir_dummy_bfd): New function to create the dummy bfd used
to store symbols for ir-only files.
(is_ir_dummy_bfd): New function to check if a bfd is ir-only.
(asymbol_from_plugin_symbol): New function converts symbol formats.
(add_symbols): Call it to convert plugin syms to bfd syms and add
them to the dummy bfd.
* plugin.h: Add missing include guards.
(plugin_get_ir_dummy_bfd): Add prototype.
(is_ir_dummy_bfd): Likewise.
* testplug.c (TV_MESSAGE): New helper macro.
(struct claim_file): New struct.
(claim_file_t): New typedef.
(tag_names[]): Make static and const.
(claimfiles_list): New variable.
(claimfiles_tail_chain_ptr): Likewise.
(last_claimfile): Likewise.
(record_claim_file): Record a file to claim on a singly-linked list.
(parse_symdefstr): Parse an ASCII representation of a symbol from a
plugin option into the fields of a struct ld_plugin_symbol.
(record_claimed_file_symbol): Use it to parse plugin option for
adding a symbol.
(parse_option): Parse claim file and add symbol options.
(dump_tv_tag): Use TV_MESSAGE.
(onload): Likewise.
(onclaim_file): Make static. Use TV_MESSAGE. Scan list of files to
claim and claim this file if required, adding any symbols specified.
(onall_symbols_read): Make static and use TV_MESSAGE.
(oncleanup): Likewise.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 2/6).
* ld-plugin/plugin-3.d: Enable regexes for new functionality.
* ld-plugin/plugin-5.d: Likewise.
* ld-plugin/plugin-6.d: New testcase.
* ld-plugin/plugin-7.d: Likewise.
* ld-plugin/plugin.exp: Use 'nm' on compiled test objects to determine
whether symbols in plugin arguments need an underscore prefix. Add
new plugin-6.d and plugin-7.d testcases.
---
[PATCH] Implement get symbols callback.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 3/6).
* ldmain.c (notice)[ENABLE_PLUGINS]: Call plugin_notice.
* plugin.c (non_ironly_hash): Add new bfd hash table.
(plugin_load_plugins): Exit early if no plugins to load. If plugins
do load successfully, set notice_all flag in link info.
(get_symbols): Implement.
(plugin_load_plugins): Exit early if no plugins to load, else after
loading plugins successfully enable notice_all mode.
(init_non_ironly_hash): Lazily init non_ironly_hash table.
(plugin_notice): Record symbols referenced from non-IR files in the
non_ironly_hash. Suppress tracing, cref generation and nocrossrefs
tracking for symbols from dummy IR bfds.
* plugin.h: Fix formatting.
(plugin_notice): Add prototype.
* testplug.c (dumpresolutions): New global var.
(parse_options): Accept "dumpresolutions".
(onall_symbols_read): Get syms and dump resolutions if it was given.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 3/6).
* ld-plugin/plugin-8.d: New testcase.
* ld-plugin/plugin.exp: Invoke it.
---
[PATCH] Implement add input file, add input lib and set extra lib path callbacks.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 4/6).
* ldlang.c (lang_process)[ENABLE_PLUGINS]: Move invocation of
plugin_call_all_symbols_read to before setting of gc_sym_list, and
open any new input files that may have been added during it.
* ldmain.c (multiple_definition)[ENABLE_PLUGINS]: Call out to
plugin_multiple_definition and let it have first say over what to do
with the clashing definitions.
* plugin.c (no_more_claiming): New boolean variable.
(plugin_cached_allow_multiple_defs): Likewise.
(add_input_file): Implement.
(add_input_library): Likewise.
(set_extra_library_path): Likewise.
(plugin_call_claim_file): Don't do anything when no_more_claiming set.
(plugin_call_all_symbols_read): Set it. Disable link info
"allow_multiple_definition" flag, but cache its value.
(plugin_multiple_definition): New function.
* plugin.h (plugin_multiple_definition): Add prototype.
* testplug.c (addfile_enum_t): New enumerated typedef.
(add_file_t): New struct typedef.
(addfiles_list): New variable.
(addfiles_tail_chain_ptr): Likewise.
(record_add_file): New function.
(parse_option): Parse "add:", "lib:" and "dir:" options and call it.
(onall_symbols_read): Iterate the list of new files, libs and dirs,
adding them.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 4/6).
* ld-plugin/plugin-9.d: New testcase.
* ld-plugin/plugin.exp: Invoke it.
---
[PATCH] Add ELF symbol visibility support to plugin interface.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 5/6).
* plugin.c (asymbol_from_plugin_symbol): If the bfd is an ELF bfd,
find the elf symbol data and set the visibility in the st_other field.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 5/6).
* ld-plugin/plugin-ignore.d: New dump test control script.
* ld-plugin/plugin-vis-1.d: Likewise.
* ld-plugin/plugin.exp: Add list of ELF-only tests and run them if
testing on an ELF target.
---
[PATCH] Add archive support to plugin interface.
bfd/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* aoutx.h (aout_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(aout_link_check_archive_element): Handle substitute bfd if it
was set during add_archive_element callback in the above.
* cofflink.c (coff_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(coff_link_check_archive_element): Handle substitute bfd if it
was set during add_archive_element callback in the above.
* ecoff.c (read_ext_syms_and_strs): New function holds symbol-reading
code factored-out from ecoff_link_check_archive_element.
(reread_ext_syms_and_strs): Clear old symbols and call it.
(ecoff_link_check_archive_element): Use the above. Handle substitute
BFD if one is set by add_archive_element callback.
(ecoff_link_add_archive_symbols): Likewise allow bfd substitution.
* elflink.c (elf_link_add_archive_symbols): Likewise.
* linker.c (generic_link_check_archive_element): Likewise.
* pdp11.c (aout_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(aout_link_check_archive_element): Handle substitute bfd if it was
set during add_archive_element callback in the above.
* vms-alpha.c (alpha_vms_link_add_archive_symbols): Handle substitute
BFD if one is set by add_archive_element callback.
* xcofflink.c (xcoff_link_check_dynamic_ar_symbols): Take new "subsbfd"
reference parameter and pass it when invoking add_archive_element
callback.
(xcoff_link_check_ar_symbols): Likewise.
(xcoff_link_check_archive_element): Handle bfd substitution if it was
set by callback in the above.
include/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* bfdlink.h (struct_bfd_link_callbacks): Document new argument
to add_archive_element callback used to return a replacement bfd which
is to be added to the hash table in place of the original element.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* ldlang.c (load_symbols): Handle bfd subsitution when calling the
add_archive_element callback.
* ldmain.c (add_archive_element)[ENABLE_PLUGINS]: Offer the archive
member to the plugins and if claimed set "subsbfd" output parameter to
point to the dummy IR-only BFD.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* ld-plugin/plugin-10.d: New dump test control script.
* ld-plugin/plugin-11.d: Likewise.
* ld-plugin/plugin.exp: Run them.
---
2010-10-14 03:31:33 +02:00
|
|
|
|
2014-08-12 11:59:33 +02:00
|
|
|
/* Set if reloading an archive or --as-needed lib. */
|
|
|
|
unsigned int reload : 1;
|
|
|
|
|
2011-03-10 11:25:02 +01:00
|
|
|
#ifdef ENABLE_PLUGINS
|
Applied patch series for LD plugin interface (six parts).
[PATCH] Add infrastructure for plugin API; functionality to follow.
include/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* plugin-api.h (LDPT_GNU_LD_VERSION): New ld_plugin_tag enum member.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* configure.in: Add AC_CHECKs for file io and dlfcn headers and
functions and AC_SEARCH for -ldl.
(enable_plugins): New shell variable set if above tests find dlopen
functionality.
(ENABLE_PLUGINS): Add related automake conditional.
* configure: Regenerate.
* config.in: Likewise.
* Makefile.am (PLUGIN_C): Declare plugin C source file, conditional
on ENABLE_PLUGINS being defined.
(PLUGIN_H): Likewise for header file.
(PLUGIN_OBJECT): Likewise for object file.
(PLUGIN_CFLAGS): Likewise -D flag required to compile plugin support.
(AM_CPPFLAGS): Use PLUGIN_CFLAGS.
(CFILES): Use PLUGIN_C.
(HFILES): Use PLUGIN_H.
(OFILES): Use PLUGIN_OBJECT.
(ld_new_SOURCES): Use PLUGIN_C.
(noinst_LTLIBRARIES)[ENABLE_PLUGINS]: Declare test plugin.
(libldtestplug_la_SOURCES)[ENABLE_PLUGINS]: Add automake definition
for test plugin.
(libldtestplug_la_CFLAGS)[ENABLE_PLUGINS]: Likewise.
(libldtestplug_la_LDFLAGS)[ENABLE_PLUGINS]: Likewise.
* Makefile.in: Regenerate.
* sysdep.h: Include stdarg.h, unistd.h and one of fcntl.h or
sys/file.h where available. Include dlfcn.h when ENABLE_PLUGINS.
(O_RDONLY): Supply default definition likewise to bfd's sysdep.h
(O_WRONLY): Likewise.
(O_RDWR): Likewise.
(O_ACCMODE): Likewise.
(O_BINARY): Likewise.
(SEEK_SET): Likewise.
(SEEK_CUR): Likewise.
(SEEK_END): Likewise.
* ldmisc.c (vfinfo): Make non-static. Add %p format char.
* ldmisc.h (vfinfo): Declare extern prototype.
* lexsup.c (enum option_values)[ENABLE_PLUGINS]: Add new entries for
OPTION_PLUGIN and OPTION_PLUGIN_OPT.
(ld_options[])[ENABLE_PLUGINS]: Add option data for the above two.
(parse_args)[ENABLE_PLUGINS]: Handle them, and load all plugins once
option parsing is complete.
* ldmain.c (main)[ENABLE_PLUGINS]: Call plugin cleanup hooks just
after lang_finish.
* plugin.c: New source file.
* plugin.h: Likewise new header.
* testplug.c: New source file.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 1/6).
* ld-bootstrap/bootstrap.exp: Skip static tests also if LD plugins
are enabled.
* lib/ld-lib.exp (proc regexp_diff): Extend verbose debug output.
(proc set_file_contents): Write a file with the supplied content.
(run_ld_link_tests): Add new 'ld' action to test linker output.
(proc check_plugin_api_available): Return true if linker under test
supports the plugin API.
* ld-plugin/func.c: New test source file.
* ld-plugin/main.c: Likewise.
* ld-plugin/text.c: Likewise.
* ld-plugin/plugin-1.d: New dump test output pattern script.
* ld-plugin/plugin-2.d: Likewise.
* ld-plugin/plugin-3.d: Likewise.
* ld-plugin/plugin-4.d: Likewise.
* ld-plugin/plugin-5.d: Likewise.
* ld-plugin/plugin.exp: New test control script.
---
[PATCH] Implement claim file and all symbols read hooks and add symbols callback.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 2/6).
* ldfile.c (ldfile_try_open_bfd)[ENABLE_PLUGINS]: Don't return early
during compat checks if they pass, instead offer any successfully
opened and accepted file to the plugin claim file hooks chain. Create
a dummy bfd to accept symbols added by the plugin, if the plugin
claims the file.
* ldlang.c (lang_process)[ENABLE_PLUGINS]: Call plugin all symbols
read hook chain before ldemul_after_open.
* ldlang.h (struct lang_input_statement_struct): Add new single-bit
'claimed' flag.
* plugin.c (IRONLY_SUFFIX): New macro for dummy bfd file suffix.
(IRONLY_SUFFIX_LEN): Length of the above string.
(plugin_get_ir_dummy_bfd): New function to create the dummy bfd used
to store symbols for ir-only files.
(is_ir_dummy_bfd): New function to check if a bfd is ir-only.
(asymbol_from_plugin_symbol): New function converts symbol formats.
(add_symbols): Call it to convert plugin syms to bfd syms and add
them to the dummy bfd.
* plugin.h: Add missing include guards.
(plugin_get_ir_dummy_bfd): Add prototype.
(is_ir_dummy_bfd): Likewise.
* testplug.c (TV_MESSAGE): New helper macro.
(struct claim_file): New struct.
(claim_file_t): New typedef.
(tag_names[]): Make static and const.
(claimfiles_list): New variable.
(claimfiles_tail_chain_ptr): Likewise.
(last_claimfile): Likewise.
(record_claim_file): Record a file to claim on a singly-linked list.
(parse_symdefstr): Parse an ASCII representation of a symbol from a
plugin option into the fields of a struct ld_plugin_symbol.
(record_claimed_file_symbol): Use it to parse plugin option for
adding a symbol.
(parse_option): Parse claim file and add symbol options.
(dump_tv_tag): Use TV_MESSAGE.
(onload): Likewise.
(onclaim_file): Make static. Use TV_MESSAGE. Scan list of files to
claim and claim this file if required, adding any symbols specified.
(onall_symbols_read): Make static and use TV_MESSAGE.
(oncleanup): Likewise.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 2/6).
* ld-plugin/plugin-3.d: Enable regexes for new functionality.
* ld-plugin/plugin-5.d: Likewise.
* ld-plugin/plugin-6.d: New testcase.
* ld-plugin/plugin-7.d: Likewise.
* ld-plugin/plugin.exp: Use 'nm' on compiled test objects to determine
whether symbols in plugin arguments need an underscore prefix. Add
new plugin-6.d and plugin-7.d testcases.
---
[PATCH] Implement get symbols callback.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 3/6).
* ldmain.c (notice)[ENABLE_PLUGINS]: Call plugin_notice.
* plugin.c (non_ironly_hash): Add new bfd hash table.
(plugin_load_plugins): Exit early if no plugins to load. If plugins
do load successfully, set notice_all flag in link info.
(get_symbols): Implement.
(plugin_load_plugins): Exit early if no plugins to load, else after
loading plugins successfully enable notice_all mode.
(init_non_ironly_hash): Lazily init non_ironly_hash table.
(plugin_notice): Record symbols referenced from non-IR files in the
non_ironly_hash. Suppress tracing, cref generation and nocrossrefs
tracking for symbols from dummy IR bfds.
* plugin.h: Fix formatting.
(plugin_notice): Add prototype.
* testplug.c (dumpresolutions): New global var.
(parse_options): Accept "dumpresolutions".
(onall_symbols_read): Get syms and dump resolutions if it was given.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 3/6).
* ld-plugin/plugin-8.d: New testcase.
* ld-plugin/plugin.exp: Invoke it.
---
[PATCH] Implement add input file, add input lib and set extra lib path callbacks.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 4/6).
* ldlang.c (lang_process)[ENABLE_PLUGINS]: Move invocation of
plugin_call_all_symbols_read to before setting of gc_sym_list, and
open any new input files that may have been added during it.
* ldmain.c (multiple_definition)[ENABLE_PLUGINS]: Call out to
plugin_multiple_definition and let it have first say over what to do
with the clashing definitions.
* plugin.c (no_more_claiming): New boolean variable.
(plugin_cached_allow_multiple_defs): Likewise.
(add_input_file): Implement.
(add_input_library): Likewise.
(set_extra_library_path): Likewise.
(plugin_call_claim_file): Don't do anything when no_more_claiming set.
(plugin_call_all_symbols_read): Set it. Disable link info
"allow_multiple_definition" flag, but cache its value.
(plugin_multiple_definition): New function.
* plugin.h (plugin_multiple_definition): Add prototype.
* testplug.c (addfile_enum_t): New enumerated typedef.
(add_file_t): New struct typedef.
(addfiles_list): New variable.
(addfiles_tail_chain_ptr): Likewise.
(record_add_file): New function.
(parse_option): Parse "add:", "lib:" and "dir:" options and call it.
(onall_symbols_read): Iterate the list of new files, libs and dirs,
adding them.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 4/6).
* ld-plugin/plugin-9.d: New testcase.
* ld-plugin/plugin.exp: Invoke it.
---
[PATCH] Add ELF symbol visibility support to plugin interface.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 5/6).
* plugin.c (asymbol_from_plugin_symbol): If the bfd is an ELF bfd,
find the elf symbol data and set the visibility in the st_other field.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 5/6).
* ld-plugin/plugin-ignore.d: New dump test control script.
* ld-plugin/plugin-vis-1.d: Likewise.
* ld-plugin/plugin.exp: Add list of ELF-only tests and run them if
testing on an ELF target.
---
[PATCH] Add archive support to plugin interface.
bfd/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* aoutx.h (aout_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(aout_link_check_archive_element): Handle substitute bfd if it
was set during add_archive_element callback in the above.
* cofflink.c (coff_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(coff_link_check_archive_element): Handle substitute bfd if it
was set during add_archive_element callback in the above.
* ecoff.c (read_ext_syms_and_strs): New function holds symbol-reading
code factored-out from ecoff_link_check_archive_element.
(reread_ext_syms_and_strs): Clear old symbols and call it.
(ecoff_link_check_archive_element): Use the above. Handle substitute
BFD if one is set by add_archive_element callback.
(ecoff_link_add_archive_symbols): Likewise allow bfd substitution.
* elflink.c (elf_link_add_archive_symbols): Likewise.
* linker.c (generic_link_check_archive_element): Likewise.
* pdp11.c (aout_link_check_ar_symbols): Take new "subsbfd" reference
parameter and pass it when invoking add_archive_element callback.
(aout_link_check_archive_element): Handle substitute bfd if it was
set during add_archive_element callback in the above.
* vms-alpha.c (alpha_vms_link_add_archive_symbols): Handle substitute
BFD if one is set by add_archive_element callback.
* xcofflink.c (xcoff_link_check_dynamic_ar_symbols): Take new "subsbfd"
reference parameter and pass it when invoking add_archive_element
callback.
(xcoff_link_check_ar_symbols): Likewise.
(xcoff_link_check_archive_element): Handle bfd substitution if it was
set by callback in the above.
include/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* bfdlink.h (struct_bfd_link_callbacks): Document new argument
to add_archive_element callback used to return a replacement bfd which
is to be added to the hash table in place of the original element.
ld/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* ldlang.c (load_symbols): Handle bfd subsitution when calling the
add_archive_element callback.
* ldmain.c (add_archive_element)[ENABLE_PLUGINS]: Offer the archive
member to the plugins and if claimed set "subsbfd" output parameter to
point to the dummy IR-only BFD.
ld/testsuite/ChangeLog:
2010-10-14 Dave Korn <dave.korn.cygwin@gmail.com>
Apply LD plugin patch series (part 6/6).
* ld-plugin/plugin-10.d: New dump test control script.
* ld-plugin/plugin-11.d: Likewise.
* ld-plugin/plugin.exp: Run them.
---
2010-10-14 03:31:33 +02:00
|
|
|
/* Set if the file was claimed by a plugin. */
|
|
|
|
unsigned int claimed : 1;
|
|
|
|
|
2011-03-10 11:25:02 +01:00
|
|
|
/* Set if the file was claimed from an archive. */
|
|
|
|
unsigned int claim_archive : 1;
|
2015-02-14 09:08:32 +01:00
|
|
|
|
|
|
|
/* Set if added by the lto plugin add_input_file callback. */
|
|
|
|
unsigned int lto_output : 1;
|
2011-03-10 11:25:02 +01:00
|
|
|
#endif /* ENABLE_PLUGINS */
|
2014-08-09 02:26:41 +02:00
|
|
|
|
|
|
|
/* Head of list of pushed flags. */
|
|
|
|
struct lang_input_statement_flags *pushed;
|
2012-03-05 23:43:40 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct lang_input_statement_struct
|
|
|
|
{
|
|
|
|
lang_statement_header_type header;
|
|
|
|
/* Name of this file. */
|
|
|
|
const char *filename;
|
|
|
|
/* Name to use for the symbol giving address of text start.
|
|
|
|
Usually the same as filename, but for a file spec'd with
|
|
|
|
-l this is the -l switch itself rather than the filename. */
|
|
|
|
const char *local_sym_name;
|
|
|
|
|
|
|
|
bfd *the_bfd;
|
|
|
|
|
bfd, ld: add CTF section linking
This is quite complicated because the CTF section's contents depend on
the final contents of the symtab and strtab, because it has two sections
whose contents are shuffled to be in 1:1 correspondence with the symtab,
and an internal strtab that gets deduplicated against the ELF strtab
(with offsets adjusted to point into the ELF strtab instead). It is
also compressed if large enough, so its size depends on its contents!
So we cannot construct it as early as most sections: we cannot even
*begin* construction until after the symtab and strtab are finalized.
Thankfully there is already one section treated similarly: compressed
debugging sections: the only differences are that compressed debugging
sections have extra handling to deal with their changing name if
compressed (CTF sections are always called ".ctf" for now, though we
have reserved ".ctf.*" against future use), and that compressed
debugging sections have previously-uncompressed content which has to be
stashed away for later compression, while CTF sections have no content
at all until we generate it (very late).
BFD also cannot do the link itself: libctf knows how to do it, and BFD
cannot call libctf directly because libctf already depends on bfd for
file I/O. So we have to use a pair of callbacks, one, examine_strtab,
which allows a caller to examine the symtab and strtab after
finalization (called from elf_link_swap_symbols_out(), right before the
symtabs are written, and after the strtab has been finalized), and one
which actually does the emission (called emit_ctf simply because it is
grouped with a bunch of section-specific late-emission function calls at
the bottom of bfd_elf_final_link, and a section-specific name seems best
for that). emit_ctf is actually called *twice*: once from lang_process
if the emulation suggests that this bfd target does not examine the
symtab or strtab, and once via a bfd callback if it does. (This means
that non-ELF targets still get CTF emitted, even though the late CTF
emission stage is never called for them).
v2: merged with non-ELF support patch: slight commit message
adjustments.
v3: do not spend time merging CTF, or crash, if the CTF section is
explicitly discarded. Do not try to merge or compress CTF unless
linking.
v4: add CTF_COMPRESSION_THRESHOLD. Annul the freed input ctf_file_t's
after writeout: set SEC_IN_MEMORY on the output contents so a future
bfd enhancement knows it could free it. Add SEC_LINKER_CREATED |
SEC_KEEP to avoid having to add .ctf to the linker script. Drop
now-unnecessary ldlang.h-level elf-bfd.h include and hackery around
it. Adapt to elf32.em->elf.em and elf-generic.em->ldelf*.c
changes.
v5: fix tabdamage. Drop #inclusions in .h files: include in .c files,
.em files, and use struct forwards instead. Use bfd_section_is_ctf
inline function rather than SECTION_IS_CTF macro. Move a few
comments.
* Makefile.def (dependencies): all-ld depends on all-libctf.
* Makefile.in: Regenerated.
include/
* bfdlink.h (elf_strtab_hash): New forward.
(elf_sym_strtab): Likewise.
(struct bfd_link_callbacks <examine_strtab>): New.
(struct bfd_link_callbacks <emit_ctf>): Likewise.
bfd/
* elf-bfd.h (bfd_section_is_ctf): New inline function.
* elf.c (special_sections_c): Add ".ctf".
(assign_file_positions_for_non_load_sections): Note that
compressed debugging sections etc are not assigned here. Treat
CTF sections like SEC_ELF_COMPRESS sections when is_linker_output:
sh_offset -1.
(assign_file_positions_except_relocs): Likewise.
(find_section_in_list): Note that debugging and CTF sections, as
well as reloc sections, are assigned later.
(_bfd_elf_assign_file_positions_for_non_load): CTF sections get
their size and contents updated.
(_bfd_elf_set_section_contents): Skip CTF sections: unlike
compressed sections, they have no uncompressed content to copy at
this stage.
* elflink.c (elf_link_swap_symbols_out): Call the examine_strtab
callback right before the strtab is written out.
(bfd_elf_final_link): Don't cache the section contents of CTF
sections: they are not populated yet. Call the emit_ctf callback
right at the end, after all the symbols and strings are flushed
out.
ld/
* ldlang.h: (struct lang_input_statement_struct): Add the_ctf.
(struct elf_sym_strtab): Add forward.
(struct elf_strtab_hash): Likewise.
(ldlang_ctf_apply_strsym): Declare.
(ldlang_write_ctf_late): Likewise.
* ldemul.h (ldemul_emit_ctf_early): New.
(ldemul_examine_strtab_for_ctf): Likewise.
(ld_emulation_xfer_type) <emit_ctf_early>: Likewise.
(ld_emulation_xfer_type) <examine_strtab_for_ctf>: Likewise.
* ldemul.c (ldemul_emit_ctf_early): New.
(ldemul_examine_strtab_for_ctf): Likewise.
* ldlang.c: Include ctf-api.h.
(CTF_COMPRESSION_THRESHOLD): New.
(ctf_output): New. Initialized in...
(ldlang_open_ctf): ... this new function. Open all the CTF
sections in the input files: mark them non-loaded and empty
so as not to copy their contents to the output, but linker-created
so the section gets created in the target.
(ldlang_merge_ctf): New, merge types via ctf_link_add_ctf and
ctf_link.
(ldlang_ctf_apply_strsym): New, an examine_strtab callback: wrap
ldemul_examine_strtab_for_ctf.
(lang_write_ctf): New, write out the CTF section.
(ldlang_write_ctf_late): New, late call via bfd's emit_ctf hook.
(lang_process): Call ldlang_open_ctf, ldlang_merge_ctf, and
lang_write_ctf.
* ldmain.c (link_callbacks): Add ldlang_ctf_apply_strsym,
ldlang_write_ctf_late.
* emultempl/aix.em: Add ctf-api.h.
* emultempl/armcoff.em: Likewise.
* emultempl/beos.em: Likewise.
* emultempl/elf.em: Likewise.
* emultempl/generic.em: Likewise.
* emultempl/linux.em: Likewise.
* emultempl/msp430.em: Likewise.
* emultempl/pe.em: Likewise.
* emultempl/pep.em: Likewise.
* emultempl/ticoff.em: Likewise.
* emultempl/vanilla.em: Likewise.
* ldcref.c: Likewise.
* ldctor.c: Likewise.
* ldelf.c: Likewise.
* ldelfgen.c: Likewise.
* ldemul.c: Likewise.
* ldexp.c: Likewise.
* ldfile.c: Likewise.
* ldgram.c: Likewise.
* ldlex.l: Likewise.
* ldmain.c: Likewise.
* ldmisc.c: Likewise.
* ldver.c: Likewise.
* ldwrite.c: Likewise.
* lexsup.c: Likewise.
* mri.c: Likewise.
* pe-dll.c: Likewise.
* plugin.c: Likewise.
* ldelfgen.c (ldelf_emit_ctf_early): New.
(ldelf_examine_strtab_for_ctf): tell libctf about the symtab and
strtab.
(struct ctf_strsym_iter_cb_arg): New, state to do so.
(ldelf_ctf_strtab_iter_cb): New: tell libctf about
each string in the strtab in turn.
(ldelf_ctf_symbols_iter_cb): New, tell libctf
about each symbol in the symtab in turn.
* ldelfgen.h (struct elf_sym_strtab): Add forward.
(struct elf_strtab_hash): Likewise.
(struct ctf_file): Likewise.
(ldelf_emit_ctf_early): Declare.
(ldelf_examine_strtab_for_ctf): Likewise.
* emultempl/elf-generic.em (LDEMUL_EMIT_CTF_EARLY): Set it.
(LDEMUL_EXAMINE_STRTAB_FOR_CTF): Likewise.
* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Add
emit_ctf_early and examine_strtab_for_ctf, NULL by default.
* emultempl/armcoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/beos.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/generic.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/linux.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/msp430.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pe.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pep.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/ticoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/vanilla.em (ld_vanilla_emulation): Likewise.
* Makefile.am: Pull in libctf (and zlib, a transitive requirement
for compressed CTF section emission). Pass it on to DejaGNU.
* configure.ac: Add AM_ZLIB.
* aclocal.m4: Added zlib.m4.
* Makefile.in: Regenerated.
* testsuite/ld-bootstrap/bootstrap.exp: Use it when relinking ld.
2019-07-13 23:38:00 +02:00
|
|
|
ctf_archive_t *the_ctf;
|
|
|
|
|
2012-03-05 23:43:40 +01:00
|
|
|
struct flag_info *section_flag_list;
|
|
|
|
|
2018-11-29 14:42:49 +01:00
|
|
|
/* Next pointer for file_chain statement list. */
|
2019-08-10 03:00:19 +02:00
|
|
|
struct lang_input_statement_struct *next;
|
2012-03-05 23:43:40 +01:00
|
|
|
|
2018-11-29 14:42:49 +01:00
|
|
|
/* Next pointer for input_file_chain statement list. */
|
2019-08-10 03:00:19 +02:00
|
|
|
struct lang_input_statement_struct *next_real_file;
|
2012-03-05 23:43:40 +01:00
|
|
|
|
|
|
|
const char *target;
|
2011-03-10 11:25:02 +01:00
|
|
|
|
2012-03-05 23:43:40 +01:00
|
|
|
struct lang_input_statement_flags flags;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_input_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
asection *section;
|
2000-09-29 15:21:41 +02:00
|
|
|
} lang_input_section_type;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2014-01-22 03:21:19 +01:00
|
|
|
struct map_symbol_def {
|
|
|
|
struct bfd_link_hash_entry *entry;
|
|
|
|
struct map_symbol_def *next;
|
|
|
|
};
|
|
|
|
|
2014-01-16 02:17:25 +01:00
|
|
|
/* For input sections, when writing a map file: head / tail of a linked
|
|
|
|
list of hash table entries for symbols defined in this section. */
|
|
|
|
typedef struct input_section_userdata_struct
|
|
|
|
{
|
|
|
|
struct map_symbol_def *map_symbol_def_head;
|
|
|
|
struct map_symbol_def **map_symbol_def_tail;
|
|
|
|
unsigned long map_symbol_def_count;
|
|
|
|
} input_section_userdata_type;
|
|
|
|
|
bfd macro conversion to inline functions
This converts some of the macros that access struct bfd fields to
inline functions.
bfd/
* archive.c (bfd_generic_archive_p): Use bfd_set_thin_archive.
* bfd-in.h (bfd_get_filename, bfd_get_cacheable, bfd_get_format),
(bfd_get_target, bfd_get_flavour, bfd_family_coff, bfd_big_endian),
(bfd_little_endian, bfd_header_big_endian, bfd_header_little_endian),
(bfd_get_file_flags, bfd_applicable_file_flags),
(bfd_applicable_section_flags, bfd_has_map, bfd_is_thin_archive),
(bfd_valid_reloc_types, bfd_usrdata, bfd_get_start_address),
(bfd_get_symcount, bfd_get_outsymbols, bfd_count_sections),
(bfd_get_dynamic_symcount, bfd_get_symbol_leading_char): Delete.
* bfd/bfd.c (bfd_get_filename, bfd_get_cacheable, bfd_get_format),
(bfd_get_file_flags, bfd_get_start_address, bfd_get_symcount),
(bfd_get_dynamic_symcount, bfd_get_outsymbols, bfd_count_sections),
(bfd_has_map, bfd_is_thin_archive, bfd_set_thin_archive),
(bfd_usrdata, bfd_set_usrdata): New inline functions.
* targets.c (bfd_get_target, bfd_get_flavour),
(bfd_applicable_file_flags, bfd_family_coff, bfd_big_endian),
(bfd_little_endian, bfd_header_big_endian),
(bfd_header_little_endian, bfd_applicable_section_flags),
(bfd_get_symbol_leading_char): New inline functions.
* bfd-in2.h: Regenerate.
binutils/
* ar.c (write_archive): Use bfd_set_thin_archive.
gdb/
* gdb_bfd.c (gdb_bfd_ref, gdb_bfd_unref): Use bfd_set_usrdata.
* dwarf2read.c (dwarf2_read_gdb_index, dwarf2_read_debug_names),
(read_indirect_string_from_dwz): Use bfd accessor.
* dwarf2read.h (struct dwz_file <filename>): Likewise.
* machoread.c (macho_symfile_read_all_oso): Likewise.
* solib.c (solib_bfd_open): Likewise.
ld/
* ldelf.c (ldelf_after_open, ldelf_place_orphan
* ldlang.c (walk_wild_file, lang_process): Use bfd_usrdata.
(load_symbols, ldlang_add_file): Use bfd_set_usrdata.
* ldmain.c (add_archive_element): Use bfd_usrdata.
* ldlang.h (bfd_input_just_syms): New inline function.
* emultempl/aarch64elf.em (build_section_lists): Use it.
* emultempl/mmo.em (mmo_place_orphan): Likewise.
* emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
* emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
* emultempl/ppc64elf.em (build_section_lists): Likewise.
sim/
* ppc/emul_generic.c (emul_add_tree_options): Delete old bfd code.
2019-09-19 04:21:04 +02:00
|
|
|
static inline bfd_boolean
|
|
|
|
bfd_input_just_syms (const bfd *abfd)
|
|
|
|
{
|
|
|
|
lang_input_statement_type *is = bfd_usrdata (abfd);
|
|
|
|
return is != NULL && is->flags.just_syms;
|
|
|
|
}
|
2014-01-16 02:17:25 +01:00
|
|
|
|
2005-04-06 Jakub Jelinek <jakub@redhat.com>
* ldlang.c: Formatting.
(walk_wild_consider_section): Remember return value from wildcardp.
(is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
(wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
2005-04-06 Robert O'Callahan <rocallahan@novell.com>
* ld.h (lean_section_userdata_type): Remove.
(fat_section_userdata_type): Remove file field.
(SECTION_USERDATA_SIZE): Remove.
* ldlang.c (init_os): Eliminate initialization of unused
lean_section_userdata_type.
* ldlang.h (callback_t, walk_wild_section_handler_t): New
typedefs.
(struct lang_wild_statement_struct): Add walk_wild_section_handler
and handler_data fields.
* ldlang.c (callback_t): Removed.
(walk_wild_consider_section, walk_wild_section_general,
section_iterator_callback, find_section, is_simple_wild,
match_simple_wild, walk_wild_section_specs1_wild0,
walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
wild_spec_can_overlap, analyze_walk_wild_section_handler): New
functions.
(lang_add_wild): Call analyze_walk_wild_section_handler.
(walk_wild_section): Renamed to walk_wild_section_general and
created a wrapper function.
(section_iterator_callback_data): New typedef.
2005-04-06 17:33:03 +02:00
|
|
|
typedef struct lang_wild_statement_struct lang_wild_statement_type;
|
|
|
|
|
|
|
|
typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
|
Add support for PowerPC VLE.
2012-05-14 Catherine Moore <clm@codesourcery.com>
* NEWS: Mention PowerPC VLE port.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
Catherine Moore <clm@codesourcery.com>
bfd/
* bfd.c (bfd_lookup_section_flags): Add section parm.
* ecoff.c (bfd_debug_section): Remove flag_info initializer.
* elf-bfd.h (bfd_elf_section_data): Move in section_flag_info.
(bfd_elf_lookup_section_flags): Add section parm.
* elf32-ppc.c (is_ppc_vle): New function.
(ppc_elf_modify_segment_map): New function.
(elf_backend_modify_segment_map): Define.
(has_vle_insns): New define.
* elf32-ppc.h (ppc_elf_modify_segment_map): Declare.
* elflink.c (bfd_elf_lookup_section_flags): Add return value & parm.
Move in logic to omit / include a section.
* libbfd-in.h (bfd_link_info): Add section parm.
(bfd_generic_lookup_section_flags): Likewise.
* reloc.c (bfd_generic_lookup_section_flags): Likewise.
* section.c (bfd_section): Move out section_flag_info.
(BFD_FAKE_SECTION): Remove flag_info initializer.
* targets.c (_bfd_lookup_section_flags): Add section parm.
2012-05-14 Catherine Moore <clm@codesourcery.com>
bfd/
* archures.c (bfd_mach_ppc_vle): New.
* bfd-in2.h: Regenerated.
* cpu-powerpc.c (bfd_powerpc_archs): New entry for vle.
* elf32-ppc.c (split16_format_type): New enumeration.
(ppc_elf_vle_split16): New function.
(HOWTO): Add entries for R_PPC_VLE relocations.
(ppc_elf_reloc_type_lookup): Handle PPC_VLE relocations.
(ppc_elf_section_flags): New function.
(ppc_elf_lookup_section_flags): New function.
(ppc_elf_section_processing): New function.
(ppc_elf_check_relocs): Handle PPC_VLE relocations.
(ppc_elf_relocation_section): Likewise.
(elf_backend_lookup_section_flags_hook): Define.
(elf_backend_section_flags): Define.
(elf_backend_section_processing): Define.
* elf32-ppc.h (ppc_elf_section_processing): Declare.
* libbfd.h: Regenerated.
* reloc.c (BFD_RELOC_PPC_VLE_REL8, BFD_RELOC_PPC_VLE_REL15,
BFD_RELOC_PPC_VLE_REL24, BFD_RELOC_PPC_VLE_LO16A,
BFD_RELOC_PPC_VLE_LO16D, BFD_RELOC_PPC_VLE_HI16A,
BFD_RELOC_PPC_VLE_HI16D, BFD_RELOC_PPC_VLE_HA16A,
BFD_RELOC_PPC_VLE_HA16D, BFD_RELOC_PPC_VLE_SDA21,
BFD_RELOC_PPC_VLE_SDA21_LO, BFD_RELOC_PPC_VLE_SDAREL_LO16A,
BFD_RELOC_PPC_VLE_SDAREL_LO16D, BFD_RELOC_PPC_VLE_SDAREL_HI16A,
BFD_RELOC_PPC_VLE_SDAREL_HI16D, BFD_RELOC_PPC_VLE_SDAREL_HA16A,
BFD_RELOC_PPC_VLE_SDAREL_HA16D): New bfd relocations.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
gas/
* config/tc-ppc.c (insn_validate): New func of existing code to call..
(ppc_setup_opcodes): ..from 2 places here.
Revise for second (VLE) opcode table.
Add #ifdef'd code to print opcode tables.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
gas/
* config/tc-ppc.c (ppc_setup_opcodes): Allow out-of-order
for the VLE conditional branches.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
gas/
* config/tc-ppc.c (PPC_VLE_SPLIT16A): New macro.
(PPC_VLE_SPLIT16D): New macro.
(PPC_VLE_LO16A): New macro.
(PPC_VLE_LO16D): New macro.
(PPC_VLE_HI16A): New macro.
(PPC_VLE_HI16D): New macro.
(PPC_VLE_HA16A): New macro.
(PPC_VLE_HA16D): New macro.
(PPC_APUINFO_VLE): New definition.
(md_chars_to_number): New function.
(md_parse_option): Check for combinations of little
endian and -mvle.
(md_show_usage): Document -mvle.
(ppc_arch): Recognize VLE.
(ppc_mach): Recognize bfd_mach_ppc_vle.
(ppc_setup_opcodes): Print the opcode table if
* config/tc-ppc.h (ppc_frag_check): Declare.
* doc/c-ppc.texi: Document -mvle.
* NEWS: Mention PowerPC VLE port.
2012-05-14 Catherine Moore <clm@codesourcery.com>
gas/
* config/tc-ppc.h (ppc_dw2_line_min_insn_length): Declare.
(DWARF2_LINE_MIN_INSN_LENGTH): Redefine.
* config/tc-ppc.c (ppc_dw2_line_min_insn_length): New.
* dwarf2dbg.c (scale_addr_delta): Handle values of 1
for DWARF2_LINE_MIN_INSN_LENGTH.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
gas/testsuite/
* gas/ppc/ppc.exp: Run new tests.
* gas/ppc/vle-reloc.d: New test.
* gas/ppc/vle-reloc.s: New test.
* gas/ppc/vle-simple-1.d: New test.
* gas/ppc/vle-simple-1.s: New test.
* gas/ppc/vle-simple-2.d: New test.
* gas/ppc/vle-simple-2.s: New test.
* gas/ppc/vle-simple-3.d: New test.
* gas/ppc/vle-simple-3.s: New test.
* gas/ppc/vle-simple-4.d: New test.
* gas/ppc/vle-simple-4.s: New test.
* gas/ppc/vle-simple-5.d: New test.
* gas/ppc/vle-simple-5.s: New test.
* gas/ppc/vle-simple-6.d: New test.
* gas/ppc/vle-simple-6.s: New test.
* gas/ppc/vle.d: New test.
* gas/ppc/vle.s: New test.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
include/elf/
* ppc.h (SEC_PPC_VLE): Remove.
2012-05-14 Catherine Moore <clm@codesourcery.com>
James Lemke <jwlemke@codesourcery.com>
include/elf/
* ppc.h (R_PPC_VLE_REL8): New reloction.
(R_PPC_VLE_REL15): Likewise.
(R_PPC_VLE_REL24): Likewise.
(R_PPC_VLE_LO16A): Likewise.
(R_PPC_VLE_LO16D): Likewise.
(R_PPC_VLE_HI16A): Likewise.
(R_PPC_VLE_HI16D): Likewise.
(R_PPC_VLE_HA16A): Likewise.
(R_PPC_VLE_HA16D): Likewise.
(R_PPC_VLE_SDA21): Likewise.
(R_PPC_VLE_SDA21_LO): Likewise.
(R_PPC_VLE_SDAREL_LO16A): Likewise.
(R_PPC_VLE_SDAREL_LO16D): Likewise.
(R_PPC_VLE_SDAREL_HI16A): Likewise.
(R_PPC_VLE_SDAREL_HI16D): Likewise.
(R_PPC_VLE_SDAREL_HA16A): Likewise.
(R_PPC_VLE_SDAREL_HA16D): Likewise.
(SEC_PPC_VLE): Remove.
(PF_PPC_VLE): New program header flag.
(SHF_PPC_VLE): New section header flag.
(vle_opcodes, vle_num_opcodes): New.
(VLE_OP): New macro.
(VLE_OP_TO_SEG): New macro.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
include/opcode/
* ppc.h (PPC_OPCODE_VLE): New definition.
(PPC_OP_SA): New macro.
(PPC_OP_SE_VLE): New macro.
(PPC_OP): Use a variable shift amount.
(powerpc_operand): Update comments.
(PPC_OPSHIFT_INV): New macro.
(PPC_OPERAND_CR): Replace with...
(PPC_OPERAND_CR_BIT): ...this and
(PPC_OPERAND_CR_REG): ...this.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
ld/
* ldlang.c (walk_wild_consider_section): Don't copy section_flag_list.
Pass it to callback.
(walk_wild_section_general): Pass section_flag_list to callback.
(lang_add_section): Add sflag_list parm.
Move out logic to keep / omit a section & call bfd_lookup_section_flags.
(output_section_callback_fast): Add sflag_list parm.
Add new parm to lang_add_section calls.
(output_section_callback): Likewise.
(check_section_callback): Add sflag_list parm.
(lang_place_orphans): Add new parm to lang_add_section calls.
(gc_section_callback): Add sflag_list parm.
(find_relro_section_callback): Likewise.
* ldlang.h (callback_t): Add flag_info parm.
(lang_add_section): Add sflag_list parm.
* emultempl/armelf.em (elf32_arm_add_stub_section):
Add lang_add_section parm.
* emultempl/beos.em (gld*_place_orphan): Likewise.
* emultempl/elf32.em (gld*_place_orphan): Likewise.
* emultempl/hppaelf.em (hppaelf_add_stub_section): Likewise.
* emultempl/m68hc1xelf.em (m68hc11elf_add_stub_section): Likewise.
* emultempl/mipself.em (mips_add_stub_section): Likewise.
* emultempl/mmo.em (mmo_place_orphan): Likewise.
* emultempl/pe.em (gld_*_place_orphan): Likewise.
* emultempl/pep.em (gld_*_place_orphan): Likewise.
* emultempl/ppc64elf.em (ppc_add_stub_section): Likewise.
* emultempl/spuelf.em (spu_place_special_section): Likewise.
* emultempl/vms.em (vms_place_orphan): Likewise.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
ld/testsuite/
* ld-powerpc/powerpc.exp: Create ppceabitests.
* ld-powerpc/vle-multiseg.s: New.
* ld-powerpc/vle-multiseg-1.d: New.
* ld-powerpc/vle-multiseg-1.ld: New.
* ld-powerpc/vle-multiseg-2.d: New.
* ld-powerpc/vle-multiseg-2.ld: New.
* ld-powerpc/vle-multiseg-3.d: New.
* ld-powerpc/vle-multiseg-3.ld: New.
* ld-powerpc/vle-multiseg-4.d: New.
* ld-powerpc/vle-multiseg-4.ld: New.
* ld-powerpc/vle-multiseg-5.d: New.
* ld-powerpc/vle-multiseg-5.ld: New.
* ld-powerpc/vle-multiseg-6.d: New.
* ld-powerpc/vle-multiseg-6.ld: New.
* ld-powerpc/vle-multiseg-6a.s: New.
* ld-powerpc/vle-multiseg-6b.s: New.
* ld-powerpc/vle-multiseg-6c.s: New.
* ld-powerpc/vle-multiseg-6d.s: New.
* ld-powerpc/powerpc.exp: Run new tests.
2012-05-14 Catherine Moore <clm@codesourcery.com>
ld/
* NEWS: Mention PowerPC VLE port.
2012-05-14 Catherine Moore <clm@codesourcery.com>
ld/testsuite/
* ld-powerpc/apuinfo.rd: Update for VLE.
* ld-powerpc/vle-reloc-1.d: New.
* ld-powerpc/vle-reloc-1.s: New.
* ld-powerpc/vle-reloc-2.d: New.
* ld-powerpc/vle-reloc-2.s: New.
* ld-powerpc/vle-reloc-3.d: New.
* ld-powerpc/vle-reloc-3.s: New.
* ld-powerpc/vle-reloc-def-1.s: New.
* ld-powerpc/vle-reloc-def-2.s: New.
* ld-powerpc/vle-reloc-def-3.s: New.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
opcodes/
* ppc-dis.c (get_powerpc_dialect): Use is_ppc_vle.
(PPC_OPCD_SEGS, VLE_OPCD_SEGS): New defines.
(vle_opcd_indices): New array.
(lookup_vle): New function.
(disassemble_init_powerpc): Revise for second (VLE) opcode table.
(print_insn_powerpc): Likewise.
* ppc-opc.c: Likewise.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
Nathan Froyd <froydnj@codesourcery.com>
opcodes/
* ppc-opc.c (insert_arx, extract_arx): New functions.
(insert_ary, extract_ary): New functions.
(insert_li20, extract_li20): New functions.
(insert_rx, extract_rx): New functions.
(insert_ry, extract_ry): New functions.
(insert_sci8, extract_sci8): New functions.
(insert_sci8n, extract_sci8n): New functions.
(insert_sd4h, extract_sd4h): New functions.
(insert_sd4w, extract_sd4w): New functions.
(insert_vlesi, extract_vlesi): New functions.
(insert_vlensi, extract_vlensi): New functions.
(insert_vleui, extract_vleui): New functions.
(insert_vleil, extract_vleil): New functions.
(BI_MASK, BB_MASK, BT): Use PPC_OPERAND_CR_BIT.
(BI16, BI32, BO32, B8): New.
(B15, B24, CRD32, CRS): New.
(CRD, OBF, BFA, CR, CRFS): Use PPC_OPERAND_CR_REG.
(DB, IMM20, RD, Rx, ARX, RY, RZ): New.
(ARY, SCLSCI8, SCLSCI8N, SE_SD, SE_SDH): New.
(SH6_MASK): Use PPC_OPSHIFT_INV.
(SI8, UI5, OIMM5, UI7, BO16): New.
(VLESIMM, VLENSIMM, VLEUIMM, VLEUIMML): New.
(XT6, XA6, XB6, XB6S, XC6): Use PPC_OPSHIFT_INV.
(ALLOW8_SPRG): New.
(insert_sprg, extract_sprg): Check ALLOW8_SPRG.
(OPVUP, OPVUP_MASK OPVUP): New
(BD8, BD8_MASK, BD8IO, BD8IO_MASK): New.
(EBD8IO, EBD8IO1_MASK, EBD8IO2_MASK, EBD8IO3_MASK): New.
(BD15, BD15_MASK, EBD15, EBD15_MASK, EBD15BI, EBD15BI_MASK): New.
(BD24,BD24_MASK, C_LK, C_LK_MASK, C, C_MASK): New.
(IA16, IA16_MASK, I16A, I16A_MASK, I16L, I16L_MASK): New.
(IM7, IM7_MASK, LI20, LI20_MASK, SCI8, SCI8_MASK): New.
(SCI8BF, SCI8BF_MASK, SD4, SD4_MASK): New.
(SE_IM5, SE_IM5_MASK): New.
(SE_R, SE_R_MASK, SE_RR, SE_RR_MASK): New.
(EX, EX_MASK, BO16F, BO16T, BO32F, BO32T): New.
(BO32DNZ, BO32DZ): New.
(NO371, PPCSPE, PPCISEL, PPCEFS, MULHW): Include PPC_OPCODE_VLE.
(PPCVLE): New.
(powerpc_opcodes): Add new VLE instructions. Update existing
instruction to include PPCVLE if supported.
* ppc-dis.c (ppc_opts): Add vle entry.
(get_powerpc_dialect): New function.
(powerpc_init_dialect): VLE support.
(print_insn_big_powerpc): Call get_powerpc_dialect.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Handle negative shift counts.
(print_insn_powerpc): Handle 2-byte instruction lengths.
2012-05-14 21:45:30 +02:00
|
|
|
asection *, struct flag_info *,
|
|
|
|
lang_input_statement_type *, void *);
|
2005-04-06 Jakub Jelinek <jakub@redhat.com>
* ldlang.c: Formatting.
(walk_wild_consider_section): Remember return value from wildcardp.
(is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
(wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
2005-04-06 Robert O'Callahan <rocallahan@novell.com>
* ld.h (lean_section_userdata_type): Remove.
(fat_section_userdata_type): Remove file field.
(SECTION_USERDATA_SIZE): Remove.
* ldlang.c (init_os): Eliminate initialization of unused
lean_section_userdata_type.
* ldlang.h (callback_t, walk_wild_section_handler_t): New
typedefs.
(struct lang_wild_statement_struct): Add walk_wild_section_handler
and handler_data fields.
* ldlang.c (callback_t): Removed.
(walk_wild_consider_section, walk_wild_section_general,
section_iterator_callback, find_section, is_simple_wild,
match_simple_wild, walk_wild_section_specs1_wild0,
walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
wild_spec_can_overlap, analyze_walk_wild_section_handler): New
functions.
(lang_add_wild): Call analyze_walk_wild_section_handler.
(walk_wild_section): Renamed to walk_wild_section_general and
created a wrapper function.
(section_iterator_callback_data): New typedef.
2005-04-06 17:33:03 +02:00
|
|
|
|
|
|
|
typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
|
|
|
|
lang_input_statement_type *,
|
|
|
|
callback_t callback,
|
|
|
|
void *data);
|
|
|
|
|
2005-11-24 07:02:08 +01:00
|
|
|
typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
|
|
|
|
bfd *, const asection *);
|
|
|
|
|
2006-08-08 18:08:47 +02:00
|
|
|
/* Binary search tree structure to efficiently sort sections by
|
|
|
|
name. */
|
|
|
|
typedef struct lang_section_bst
|
|
|
|
{
|
|
|
|
asection *section;
|
|
|
|
struct lang_section_bst *left;
|
|
|
|
struct lang_section_bst *right;
|
|
|
|
} lang_section_bst_type;
|
|
|
|
|
2005-04-06 Jakub Jelinek <jakub@redhat.com>
* ldlang.c: Formatting.
(walk_wild_consider_section): Remember return value from wildcardp.
(is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
(wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
2005-04-06 Robert O'Callahan <rocallahan@novell.com>
* ld.h (lean_section_userdata_type): Remove.
(fat_section_userdata_type): Remove file field.
(SECTION_USERDATA_SIZE): Remove.
* ldlang.c (init_os): Eliminate initialization of unused
lean_section_userdata_type.
* ldlang.h (callback_t, walk_wild_section_handler_t): New
typedefs.
(struct lang_wild_statement_struct): Add walk_wild_section_handler
and handler_data fields.
* ldlang.c (callback_t): Removed.
(walk_wild_consider_section, walk_wild_section_general,
section_iterator_callback, find_section, is_simple_wild,
match_simple_wild, walk_wild_section_specs1_wild0,
walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
wild_spec_can_overlap, analyze_walk_wild_section_handler): New
functions.
(lang_add_wild): Call analyze_walk_wild_section_handler.
(walk_wild_section): Renamed to walk_wild_section_general and
created a wrapper function.
(section_iterator_callback_data): New typedef.
2005-04-06 17:33:03 +02:00
|
|
|
struct lang_wild_statement_struct
|
2004-01-13 12:10:53 +01:00
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
const char *filename;
|
2002-11-30 09:39:46 +01:00
|
|
|
bfd_boolean filenames_sorted;
|
2001-08-03 03:11:21 +02:00
|
|
|
struct wildcard_list *section_list;
|
2002-11-30 09:39:46 +01:00
|
|
|
bfd_boolean keep_sections;
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_list_type children;
|
2016-09-20 15:21:05 +02:00
|
|
|
struct name_list *exclude_name_list;
|
2005-04-06 Jakub Jelinek <jakub@redhat.com>
* ldlang.c: Formatting.
(walk_wild_consider_section): Remember return value from wildcardp.
(is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
(wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
2005-04-06 Robert O'Callahan <rocallahan@novell.com>
* ld.h (lean_section_userdata_type): Remove.
(fat_section_userdata_type): Remove file field.
(SECTION_USERDATA_SIZE): Remove.
* ldlang.c (init_os): Eliminate initialization of unused
lean_section_userdata_type.
* ldlang.h (callback_t, walk_wild_section_handler_t): New
typedefs.
(struct lang_wild_statement_struct): Add walk_wild_section_handler
and handler_data fields.
* ldlang.c (callback_t): Removed.
(walk_wild_consider_section, walk_wild_section_general,
section_iterator_callback, find_section, is_simple_wild,
match_simple_wild, walk_wild_section_specs1_wild0,
walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
wild_spec_can_overlap, analyze_walk_wild_section_handler): New
functions.
(lang_add_wild): Call analyze_walk_wild_section_handler.
(walk_wild_section): Renamed to walk_wild_section_general and
created a wrapper function.
(section_iterator_callback_data): New typedef.
2005-04-06 17:33:03 +02:00
|
|
|
|
|
|
|
walk_wild_section_handler_t walk_wild_section_handler;
|
|
|
|
struct wildcard_list *handler_data[4];
|
2006-08-08 18:08:47 +02:00
|
|
|
lang_section_bst_type *tree;
|
2011-07-11 17:03:09 +02:00
|
|
|
struct flag_info *section_flag_list;
|
2005-04-06 Jakub Jelinek <jakub@redhat.com>
* ldlang.c: Formatting.
(walk_wild_consider_section): Remember return value from wildcardp.
(is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen.
(wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen.
2005-04-06 Robert O'Callahan <rocallahan@novell.com>
* ld.h (lean_section_userdata_type): Remove.
(fat_section_userdata_type): Remove file field.
(SECTION_USERDATA_SIZE): Remove.
* ldlang.c (init_os): Eliminate initialization of unused
lean_section_userdata_type.
* ldlang.h (callback_t, walk_wild_section_handler_t): New
typedefs.
(struct lang_wild_statement_struct): Add walk_wild_section_handler
and handler_data fields.
* ldlang.c (callback_t): Removed.
(walk_wild_consider_section, walk_wild_section_general,
section_iterator_callback, find_section, is_simple_wild,
match_simple_wild, walk_wild_section_specs1_wild0,
walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1,
walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2,
wild_spec_can_overlap, analyze_walk_wild_section_handler): New
functions.
(lang_add_wild): Call analyze_walk_wild_section_handler.
(walk_wild_section): Renamed to walk_wild_section_general and
created a wrapper function.
(section_iterator_callback_data): New typedef.
2005-04-06 17:33:03 +02:00
|
|
|
};
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_address_statement_struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
2000-10-09 17:09:17 +02:00
|
|
|
const char *section_name;
|
|
|
|
union etree_union *address;
|
2004-10-26 20:41:52 +02:00
|
|
|
const segment_type *segment;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_address_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
bfd_vma output_offset;
|
2011-11-15 19:22:27 +01:00
|
|
|
bfd_size_type size;
|
1999-05-03 09:29:11 +02:00
|
|
|
asection *output_section;
|
2002-02-15 03:11:05 +01:00
|
|
|
fill_type *fill;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_padding_statement_type;
|
|
|
|
|
|
|
|
/* A group statement collects a set of libraries together. The
|
|
|
|
libraries are searched multiple times, until no new undefined
|
|
|
|
symbols are found. The effect is to search a group of libraries as
|
|
|
|
though they were a single library. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
lang_statement_list_type children;
|
|
|
|
} lang_group_statement_type;
|
|
|
|
|
ld/
* ld.texinfo (INSERT): Describe.
* ldgram.y (ldgram_in_script, ldgram_had_equals): Delete.
(INSERT_K, AFTER, BEFORE): Add as tokens.
(ifile_p1): Handle INSERT statements.
(saved_script_handle, force_make_executable): Move to..
* ldmain.c: ..here.
(previous_script_handle): New global var.
* ldmain.h (saved_script_handle, force_make_executable): Declare.
(previous_script_handle): Likewise.
* ldlex.l (INSERT_K, AFTER, BEFORE): Add tokens.
* lexsup.c (parge_args <-T>): Set previous_script_handle.
* ldlang.c (lang_for_each_statement_worker): Handle insert statement.
(map_input_to_output_sections, print_statement): Likewise.
(lang_size_sections_1, lang_do_assignments_1): Likewise.
(insert_os_after): New function, extracted from..
(lang_insert_orphan): ..here.
(process_insert_statements): New function.
(lang_process): Call it.
(lang_add_insert): New function.
* ldlang.h (lang_insert_statement_enum): New.
(lang_insert_statement_type): New.
(lang_statement_union_type): Add insert_statement.
(lang_add_insert): Declare.
ld/testsuite/
* ld-spu/ovl.lnk: Delete overlay.
* ld-spu/ovl1.lnk: New file.
* ld-spu/ovl2.lnk: New file.
* ld-spu/ovl.d: Update.
* ld-spu/ovl2.d: Update.
2008-01-25 13:03:37 +01:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
lang_statement_header_type header;
|
|
|
|
const char *where;
|
|
|
|
bfd_boolean is_before;
|
|
|
|
} lang_insert_statement_type;
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef union lang_statement_union
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_statement_header_type header;
|
|
|
|
lang_address_statement_type address_statement;
|
|
|
|
lang_assignment_statement_type assignment_statement;
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_data_statement_type data_statement;
|
1999-05-03 09:29:11 +02:00
|
|
|
lang_fill_statement_type fill_statement;
|
|
|
|
lang_group_statement_type group_statement;
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_input_section_type input_section;
|
|
|
|
lang_input_statement_type input_statement;
|
ld/
* ld.texinfo (INSERT): Describe.
* ldgram.y (ldgram_in_script, ldgram_had_equals): Delete.
(INSERT_K, AFTER, BEFORE): Add as tokens.
(ifile_p1): Handle INSERT statements.
(saved_script_handle, force_make_executable): Move to..
* ldmain.c: ..here.
(previous_script_handle): New global var.
* ldmain.h (saved_script_handle, force_make_executable): Declare.
(previous_script_handle): Likewise.
* ldlex.l (INSERT_K, AFTER, BEFORE): Add tokens.
* lexsup.c (parge_args <-T>): Set previous_script_handle.
* ldlang.c (lang_for_each_statement_worker): Handle insert statement.
(map_input_to_output_sections, print_statement): Likewise.
(lang_size_sections_1, lang_do_assignments_1): Likewise.
(insert_os_after): New function, extracted from..
(lang_insert_orphan): ..here.
(process_insert_statements): New function.
(lang_process): Call it.
(lang_add_insert): New function.
* ldlang.h (lang_insert_statement_enum): New.
(lang_insert_statement_type): New.
(lang_statement_union_type): Add insert_statement.
(lang_add_insert): Declare.
ld/testsuite/
* ld-spu/ovl.lnk: Delete overlay.
* ld-spu/ovl1.lnk: New file.
* ld-spu/ovl2.lnk: New file.
* ld-spu/ovl.d: Update.
* ld-spu/ovl2.d: Update.
2008-01-25 13:03:37 +01:00
|
|
|
lang_insert_statement_type insert_statement;
|
2019-08-10 05:32:49 +02:00
|
|
|
lang_output_section_statement_type output_section_statement;
|
|
|
|
lang_output_statement_type output_statement;
|
|
|
|
lang_padding_statement_type padding_statement;
|
|
|
|
lang_reloc_statement_type reloc_statement;
|
|
|
|
lang_target_statement_type target_statement;
|
|
|
|
lang_wild_statement_type wild_statement;
|
1999-05-03 09:29:11 +02:00
|
|
|
} lang_statement_union_type;
|
|
|
|
|
|
|
|
/* This structure holds information about a program header, from the
|
|
|
|
PHDRS command in the linker script. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
struct lang_phdr
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
struct lang_phdr *next;
|
|
|
|
const char *name;
|
|
|
|
unsigned long type;
|
2002-11-30 09:39:46 +01:00
|
|
|
bfd_boolean filehdr;
|
|
|
|
bfd_boolean phdrs;
|
1999-05-03 09:29:11 +02:00
|
|
|
etree_type *at;
|
|
|
|
etree_type *flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* This structure is used to hold a list of sections which may not
|
|
|
|
cross reference each other. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
typedef struct lang_nocrossref
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
struct lang_nocrossref *next;
|
|
|
|
const char *name;
|
2004-01-13 12:10:53 +01:00
|
|
|
} lang_nocrossref_type;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
|
|
|
/* The list of nocrossref lists. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
struct lang_nocrossrefs
|
|
|
|
{
|
1999-05-03 09:29:11 +02:00
|
|
|
struct lang_nocrossrefs *next;
|
2004-01-13 12:10:53 +01:00
|
|
|
lang_nocrossref_type *list;
|
2016-04-14 12:49:53 +02:00
|
|
|
bfd_boolean onlyfirst;
|
1999-05-03 09:29:11 +02:00
|
|
|
};
|
|
|
|
|
2001-01-14 05:36:35 +01:00
|
|
|
/* This structure is used to hold a list of input section names which
|
|
|
|
will not match an output section in the linker script. */
|
|
|
|
|
2004-01-13 12:10:53 +01:00
|
|
|
struct unique_sections
|
|
|
|
{
|
2001-01-14 05:36:35 +01:00
|
|
|
struct unique_sections *next;
|
|
|
|
const char *name;
|
|
|
|
};
|
|
|
|
|
2004-10-14 14:54:47 +02:00
|
|
|
/* Used by place_orphan to keep track of orphan sections and statements. */
|
|
|
|
|
2009-03-02 18:27:36 +01:00
|
|
|
struct orphan_save
|
|
|
|
{
|
2004-10-14 14:54:47 +02:00
|
|
|
const char *name;
|
|
|
|
flagword flags;
|
|
|
|
lang_output_section_statement_type *os;
|
|
|
|
asection **section;
|
|
|
|
lang_statement_union_type **stmt;
|
|
|
|
lang_output_section_statement_type **os_tail;
|
|
|
|
};
|
|
|
|
|
2014-01-22 06:35:12 +01:00
|
|
|
struct asneeded_minfo
|
|
|
|
{
|
|
|
|
struct asneeded_minfo *next;
|
|
|
|
const char *soname;
|
|
|
|
bfd *ref;
|
|
|
|
const char *name;
|
|
|
|
};
|
|
|
|
|
2012-03-05 23:43:40 +01:00
|
|
|
extern struct lang_phdr *lang_phdr_list;
|
|
|
|
extern struct lang_nocrossrefs *nocrossref_list;
|
2009-08-30 07:47:43 +02:00
|
|
|
extern const char *output_target;
|
1999-05-03 09:29:11 +02:00
|
|
|
extern lang_output_section_statement_type *abs_output_section;
|
2019-07-31 09:15:14 +02:00
|
|
|
extern lang_statement_list_type lang_os_list;
|
2012-03-05 23:43:40 +01:00
|
|
|
extern struct lang_input_statement_flags input_flags;
|
2002-11-30 09:39:46 +01:00
|
|
|
extern bfd_boolean lang_has_input_file;
|
1999-05-03 09:29:11 +02:00
|
|
|
extern lang_statement_list_type *stat_ptr;
|
2002-11-30 09:39:46 +01:00
|
|
|
extern bfd_boolean delete_output_file_on_failure;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2002-07-01 10:07:31 +02:00
|
|
|
extern struct bfd_sym_chain entry_symbol;
|
2002-02-10 11:55:23 +01:00
|
|
|
extern const char *entry_section;
|
2002-11-30 09:39:46 +01:00
|
|
|
extern bfd_boolean entry_from_cmdline;
|
2000-07-11 05:42:41 +02:00
|
|
|
extern lang_statement_list_type file_chain;
|
2007-03-26 13:10:44 +02:00
|
|
|
extern lang_statement_list_type input_file_chain;
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2003-10-11 11:16:20 +02:00
|
|
|
extern int lang_statement_iteration;
|
2014-01-22 06:35:12 +01:00
|
|
|
extern struct asneeded_minfo **asneeded_list_tail;
|
2003-10-11 11:16:20 +02:00
|
|
|
|
2014-05-10 02:50:01 +02:00
|
|
|
extern void (*output_bfd_hash_table_free_fn) (struct bfd_link_hash_table *);
|
|
|
|
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_init
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2005-09-30 19:45:54 +02:00
|
|
|
extern void lang_finish
|
|
|
|
(void);
|
2009-03-02 18:27:36 +01:00
|
|
|
extern lang_memory_region_type * lang_memory_region_lookup
|
|
|
|
(const char * const, bfd_boolean);
|
|
|
|
extern void lang_memory_region_alias
|
|
|
|
(const char *, const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_map
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_set_flags
|
2003-06-28 07:28:54 +02:00
|
|
|
(lang_memory_region_type *, const char *, int);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_output
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, int from_script);
|
2000-04-25 07:14:16 +02:00
|
|
|
extern lang_output_section_statement_type *lang_enter_output_section_statement
|
2013-07-19 12:39:51 +02:00
|
|
|
(const char *, etree_type *, enum section_type, etree_type *, etree_type *,
|
|
|
|
etree_type *, int, int);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_final
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2009-08-10 09:50:56 +02:00
|
|
|
extern void lang_relax_sections
|
|
|
|
(bfd_boolean);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_process
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_section_start
|
2004-10-26 20:41:52 +02:00
|
|
|
(const char *, union etree_union *, const segment_type *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_entry
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, bfd_boolean);
|
2005-06-01 06:04:19 +02:00
|
|
|
extern void lang_default_entry
|
|
|
|
(const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_target
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_add_wild
|
2003-06-28 07:28:54 +02:00
|
|
|
(struct wildcard_spec *, struct wildcard_list *, bfd_boolean);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_map
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_fill
|
2003-06-28 07:28:54 +02:00
|
|
|
(fill_type *);
|
|
|
|
extern lang_assignment_statement_type *lang_add_assignment
|
|
|
|
(union etree_union *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_attribute
|
2003-06-28 07:28:54 +02:00
|
|
|
(enum statement_enum);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_startup
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_float
|
2003-06-28 07:28:54 +02:00
|
|
|
(bfd_boolean);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_leave_output_section_statement
|
2004-01-13 12:10:53 +01:00
|
|
|
(fill_type *, const char *, lang_output_section_phdr_list *,
|
2003-06-28 07:28:54 +02:00
|
|
|
const char *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_for_each_input_file
|
2003-06-28 07:28:54 +02:00
|
|
|
(void (*dothis) (lang_input_statement_type *));
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_for_each_file
|
2003-06-28 07:28:54 +02:00
|
|
|
(void (*dothis) (lang_input_statement_type *));
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_reset_memory_regions
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2003-12-04 13:09:25 +01:00
|
|
|
extern void lang_do_assignments
|
2011-05-03 16:56:14 +02:00
|
|
|
(lang_phase_type);
|
2012-06-15 17:13:41 +02:00
|
|
|
extern asection *section_for_dot
|
|
|
|
(void);
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2002-12-08 04:56:04 +01:00
|
|
|
#define LANG_FOR_EACH_INPUT_STATEMENT(statement) \
|
|
|
|
lang_input_statement_type *statement; \
|
2019-11-22 14:12:01 +01:00
|
|
|
for (statement = (lang_input_statement_type *) file_chain.head; \
|
2017-09-02 03:38:05 +02:00
|
|
|
statement != NULL; \
|
2019-08-10 03:00:19 +02:00
|
|
|
statement = statement->next)
|
2000-09-29 15:21:41 +02:00
|
|
|
|
2008-09-07 06:02:31 +02:00
|
|
|
#define lang_output_section_find(NAME) \
|
|
|
|
lang_output_section_statement_lookup (NAME, 0, FALSE)
|
|
|
|
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_process
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void ldlang_add_file
|
2003-06-28 07:28:54 +02:00
|
|
|
(lang_input_statement_type *);
|
2004-10-14 14:54:47 +02:00
|
|
|
extern lang_output_section_statement_type *lang_output_section_find_by_flags
|
2015-10-29 06:46:22 +01:00
|
|
|
(const asection *, flagword, lang_output_section_statement_type **,
|
2005-11-24 07:02:08 +01:00
|
|
|
lang_match_sec_type_func);
|
2004-10-14 14:54:47 +02:00
|
|
|
extern lang_output_section_statement_type *lang_insert_orphan
|
2008-10-04 08:08:59 +02:00
|
|
|
(asection *, const char *, int, lang_output_section_statement_type *,
|
2005-11-17 01:10:05 +01:00
|
|
|
struct orphan_save *, etree_type *, lang_statement_list_type *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern lang_input_statement_type *lang_add_input_file
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, lang_input_file_enum_type, const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_keepsyms_file
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
2014-01-20 04:46:16 +01:00
|
|
|
extern lang_output_section_statement_type *lang_output_section_get
|
|
|
|
(const asection *);
|
2008-09-07 06:02:31 +02:00
|
|
|
extern lang_output_section_statement_type *lang_output_section_statement_lookup
|
ld/
* ldlang.c (lang_output_section_statement_lookup): Add function
comment. Make "name" non-const. Ensure duplicate entries use
the same string, allowing simple comparison in hash bucket loop.
Tweak constraint check.
(next_matching_output_section_statement): New function.
* ldlang.h (lang_output_section_statement_lookup): Update.
(next_matching_output_section_statement): Declare.
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Don't
combine orphan sections when input sections flags differ in
alloc or load.
* emultempl/pe.em: Formatting throughout.
(gld${EMULATION_NAME}_place_orphan): As for elf32.em.
* emultempl/pep.em: Formatting throughout.
(gld${EMULATION_NAME}_place_orphan): As for elf32.em.
ld/testsuite/
* ld-elf/orphan3.d, * ld-elf/orphan3a.s, * ld-elf/orphan3b.s,
* ld-elf/orphan3c.s, * ld-elf/orphan3d.s, * ld-elf/orphan3e.s,
* ld-elf/orphan3f.s: New test.
* ld-pe/orphan.d, * ld-pe/orphana.s, * ld-pe/orphanb.s,
* ld-pe/orphand.s, * ld-pe/orphane.s: New test.
* ld-pe/direct.exp: Use is_pecoff_format.
* ld-pe/longsecn.exp: Delete.
* ld-pe/pe.exp: Run new test and longsecn tests.
2009-05-15 16:22:36 +02:00
|
|
|
(const char *, int, bfd_boolean);
|
|
|
|
extern lang_output_section_statement_type *next_matching_output_section_statement
|
|
|
|
(lang_output_section_statement_type *, int);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void ldlang_add_undef
|
2010-10-28 08:45:33 +02:00
|
|
|
(const char *const, bfd_boolean);
|
2015-07-15 19:37:30 +02:00
|
|
|
extern void ldlang_add_require_defined
|
|
|
|
(const char *const);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_output_format
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, const char *, const char *, int);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_list_init
|
2003-06-28 07:28:54 +02:00
|
|
|
(lang_statement_list_type *);
|
2009-02-16 08:25:52 +01:00
|
|
|
extern void push_stat_ptr
|
|
|
|
(lang_statement_list_type *);
|
|
|
|
extern void pop_stat_ptr
|
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_data
|
2003-06-28 07:28:54 +02:00
|
|
|
(int type, union etree_union *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_add_reloc
|
2003-06-28 07:28:54 +02:00
|
|
|
(bfd_reloc_code_real_type, reloc_howto_type *, asection *, const char *,
|
|
|
|
union etree_union *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_for_each_statement
|
2003-06-28 07:28:54 +02:00
|
|
|
(void (*) (lang_statement_union_type *));
|
2010-09-10 03:23:12 +02:00
|
|
|
extern void lang_for_each_statement_worker
|
|
|
|
(void (*) (lang_statement_union_type *), lang_statement_union_type *);
|
2003-06-28 07:28:54 +02:00
|
|
|
extern void *stat_alloc
|
|
|
|
(size_t);
|
2005-05-04 13:00:28 +02:00
|
|
|
extern void strip_excluded_output_sections
|
|
|
|
(void);
|
2014-08-14 06:19:31 +02:00
|
|
|
extern void lang_clear_os_map
|
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void dprint_statement
|
2003-06-28 07:28:54 +02:00
|
|
|
(lang_statement_union_type *, int);
|
* ld.h (lang_phase_type): Move to..
* ldexp.h: ..here. Add lang_mark_phase_enum.
(node_type): Remove etree_undef and etree_unspec.
(exp_data_seg): Delete.
(struct ldexp_control, expld): New.
(invalid, exp_mark_used_section): Delete.
(exp_fold_tree, exp_get_vma, exp_get_value_int, exp_get_fill,
exp_get_abs_int): Update prototypes.
* ldexp.c (assigning_to_dot): Delete.
(expld): Define.
(make_abs): Operate directly on expld.result. Update all callers.
(new_abs): Likewise. Return void.
(new_rel_from_abs): Rename from new_rel_from_section.
(new_rel, new_rel_from_abs): Operate on expld.result and return void.
Update all callers.
(fold_unary): Operate on expld.result and return void. Remove
"current_section", "allocation_done", "dot", "dotp" and "mark_used"
params. Update all callers.
(fold_binary, fold_trinary, fold_name, exp_fold_tree_1): Likewise.
(fold_unary <ALIGN_K>): Ensure alignment is absolute.
(fold_unary <ABSOLUTE>): Use make_abs.
(fold_unary <DATA_SEGMENT_END>): Evaluate mark_phase as for
allocating_phase.
(fold_binary <DATA_SEGMENT_ALIGN, DATA_SEGMENT_RELRO_END, >): Ditto.
(fold_binary <'%','/'>): Don't error if marking.
(fold_name <SIZEOF_HEADERS>): Don't call bfd_sizeof_headers when
marking.
(fold_name <NAME>): Remove FIXME; -R is handled correctly. Don't
error when marking.
(fold_name <ADDR, LOADADDR, SIZEOF>): Don't set SEC_KEEP.
(exp_fold_tree_1): Don't error when marking.
(exp_fold_tree_1 <etree_rel>): Evaluate in all phases except first.
(exp_fold_tree_1 <etree_assign to dot>): Don't check for NULL
current section, instead check for NULL dotp.
(exp_fold_tree_1 <etree_provide>): Don't evaluate the assignment
source unless the symbol is referenced and undefined.
(exp_fold_tree): Remove "allocation_done" and "dot" params. Save
params to expld.
(exp_fold_tree_no_dot): Remove "current_section", "allocation_done
and "mark_used" params. Save params to expld. Update all callers.
(exp_assop): Do without temp var.
(exp_print_tree <etree_undef>): Delete code.
(exp_get_vma): Remove "allocation_done" param. Correct error return.
(exp_get_fill, exp_get_abs_int): Likewise.
(exp_get_value_int): Remove "allocation_done" param.
(exp_mark_used_section): Delete.
* ldgram.y (fill_exp): Update exp_get_fill call.
(origin_spec, length_spec): Update exp_get_vma call.
* ldlang.c (lang_init): Don't bother clearing lang_statement_iteration.
(lang_mark_used_section_1, lang_mark_used_section): Delete.
(strip_excluded_output_sections): Call one_lang_size_sections_pass in
marking mode. Merge old lang_mark_used_section code. Correct handling
of output sections with excluded input sections and data statements.
Don't drop non-zero sized sections. Don't zap os->bfd_section.
Do set SEC_EXCLUDE when appropriate.
(print_output_section_statement): Update for changed ldexp.c
interface.
(print_assignment, lang_size_sections_1): Likewise.
(lang_do_assignments_1, lang_enter_output_section_statement): Likewise.
(lang_new_phdr, lang_record_phdrs): Likewise.
(lang_size_sections): Likewise.
(insert_pad): Use following statement if it is a pad, rather than
creating a new one.
(lang_size_sections_1 <lang_output_section_statement_enum>): Do
process ignored output section to set vma and lma, but don't
update dot for these sections. Don't error if marking.
(lang_size_sections_1 <lang_assignment_statement_enum>): Don't
update dot for ignored sections.
(lang_size_sections_1 <lang_data_statement_enum>): Don't mark absolute
section with SEC_ALLOC.
(one_lang_size_sections_pass): New function.
(lang_size_sections): Remove first five params. Set expld.phase on
entry and exit. Use one_lang_size_sections_pass.
(lang_do_assignments): Remove all params. Update all callers.
(lang_reset_memory_regions): Clear os->processed for all output
section statements.
* ldlang.h (lang_do_assignments): Update prototype.
(lang_size_sections): Likewise.
(one_lang_size_sections_pass): Declare.
* pe-dll.c (pe_dll_fill_sections, pe_exe_fill_sections): Update
lang_size_sections and lang_do_assignments calls.
* emultempl/elf32.em (layout_sections_again): Likewise.
* emultempl/ppc64elf.em (ppc_before_allocation): Use
one_lang_size_sections_pass.
2005-06-09 04:05:47 +02:00
|
|
|
extern void lang_size_sections
|
|
|
|
(bfd_boolean *, bfd_boolean);
|
|
|
|
extern void one_lang_size_sections_pass
|
|
|
|
(bfd_boolean *, bfd_boolean);
|
ld/
* ld.texinfo (INSERT): Describe.
* ldgram.y (ldgram_in_script, ldgram_had_equals): Delete.
(INSERT_K, AFTER, BEFORE): Add as tokens.
(ifile_p1): Handle INSERT statements.
(saved_script_handle, force_make_executable): Move to..
* ldmain.c: ..here.
(previous_script_handle): New global var.
* ldmain.h (saved_script_handle, force_make_executable): Declare.
(previous_script_handle): Likewise.
* ldlex.l (INSERT_K, AFTER, BEFORE): Add tokens.
* lexsup.c (parge_args <-T>): Set previous_script_handle.
* ldlang.c (lang_for_each_statement_worker): Handle insert statement.
(map_input_to_output_sections, print_statement): Likewise.
(lang_size_sections_1, lang_do_assignments_1): Likewise.
(insert_os_after): New function, extracted from..
(lang_insert_orphan): ..here.
(process_insert_statements): New function.
(lang_process): Call it.
(lang_add_insert): New function.
* ldlang.h (lang_insert_statement_enum): New.
(lang_insert_statement_type): New.
(lang_statement_union_type): Add insert_statement.
(lang_add_insert): Declare.
ld/testsuite/
* ld-spu/ovl.lnk: Delete overlay.
* ld-spu/ovl1.lnk: New file.
* ld-spu/ovl2.lnk: New file.
* ld-spu/ovl.d: Update.
* ld-spu/ovl2.d: Update.
2008-01-25 13:03:37 +01:00
|
|
|
extern void lang_add_insert
|
|
|
|
(const char *, int);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_enter_group
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_leave_group
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2001-08-14 04:01:31 +02:00
|
|
|
extern void lang_add_section
|
2003-06-28 07:28:54 +02:00
|
|
|
(lang_statement_list_type *, asection *,
|
Add support for PowerPC VLE.
2012-05-14 Catherine Moore <clm@codesourcery.com>
* NEWS: Mention PowerPC VLE port.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
Catherine Moore <clm@codesourcery.com>
bfd/
* bfd.c (bfd_lookup_section_flags): Add section parm.
* ecoff.c (bfd_debug_section): Remove flag_info initializer.
* elf-bfd.h (bfd_elf_section_data): Move in section_flag_info.
(bfd_elf_lookup_section_flags): Add section parm.
* elf32-ppc.c (is_ppc_vle): New function.
(ppc_elf_modify_segment_map): New function.
(elf_backend_modify_segment_map): Define.
(has_vle_insns): New define.
* elf32-ppc.h (ppc_elf_modify_segment_map): Declare.
* elflink.c (bfd_elf_lookup_section_flags): Add return value & parm.
Move in logic to omit / include a section.
* libbfd-in.h (bfd_link_info): Add section parm.
(bfd_generic_lookup_section_flags): Likewise.
* reloc.c (bfd_generic_lookup_section_flags): Likewise.
* section.c (bfd_section): Move out section_flag_info.
(BFD_FAKE_SECTION): Remove flag_info initializer.
* targets.c (_bfd_lookup_section_flags): Add section parm.
2012-05-14 Catherine Moore <clm@codesourcery.com>
bfd/
* archures.c (bfd_mach_ppc_vle): New.
* bfd-in2.h: Regenerated.
* cpu-powerpc.c (bfd_powerpc_archs): New entry for vle.
* elf32-ppc.c (split16_format_type): New enumeration.
(ppc_elf_vle_split16): New function.
(HOWTO): Add entries for R_PPC_VLE relocations.
(ppc_elf_reloc_type_lookup): Handle PPC_VLE relocations.
(ppc_elf_section_flags): New function.
(ppc_elf_lookup_section_flags): New function.
(ppc_elf_section_processing): New function.
(ppc_elf_check_relocs): Handle PPC_VLE relocations.
(ppc_elf_relocation_section): Likewise.
(elf_backend_lookup_section_flags_hook): Define.
(elf_backend_section_flags): Define.
(elf_backend_section_processing): Define.
* elf32-ppc.h (ppc_elf_section_processing): Declare.
* libbfd.h: Regenerated.
* reloc.c (BFD_RELOC_PPC_VLE_REL8, BFD_RELOC_PPC_VLE_REL15,
BFD_RELOC_PPC_VLE_REL24, BFD_RELOC_PPC_VLE_LO16A,
BFD_RELOC_PPC_VLE_LO16D, BFD_RELOC_PPC_VLE_HI16A,
BFD_RELOC_PPC_VLE_HI16D, BFD_RELOC_PPC_VLE_HA16A,
BFD_RELOC_PPC_VLE_HA16D, BFD_RELOC_PPC_VLE_SDA21,
BFD_RELOC_PPC_VLE_SDA21_LO, BFD_RELOC_PPC_VLE_SDAREL_LO16A,
BFD_RELOC_PPC_VLE_SDAREL_LO16D, BFD_RELOC_PPC_VLE_SDAREL_HI16A,
BFD_RELOC_PPC_VLE_SDAREL_HI16D, BFD_RELOC_PPC_VLE_SDAREL_HA16A,
BFD_RELOC_PPC_VLE_SDAREL_HA16D): New bfd relocations.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
gas/
* config/tc-ppc.c (insn_validate): New func of existing code to call..
(ppc_setup_opcodes): ..from 2 places here.
Revise for second (VLE) opcode table.
Add #ifdef'd code to print opcode tables.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
gas/
* config/tc-ppc.c (ppc_setup_opcodes): Allow out-of-order
for the VLE conditional branches.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
gas/
* config/tc-ppc.c (PPC_VLE_SPLIT16A): New macro.
(PPC_VLE_SPLIT16D): New macro.
(PPC_VLE_LO16A): New macro.
(PPC_VLE_LO16D): New macro.
(PPC_VLE_HI16A): New macro.
(PPC_VLE_HI16D): New macro.
(PPC_VLE_HA16A): New macro.
(PPC_VLE_HA16D): New macro.
(PPC_APUINFO_VLE): New definition.
(md_chars_to_number): New function.
(md_parse_option): Check for combinations of little
endian and -mvle.
(md_show_usage): Document -mvle.
(ppc_arch): Recognize VLE.
(ppc_mach): Recognize bfd_mach_ppc_vle.
(ppc_setup_opcodes): Print the opcode table if
* config/tc-ppc.h (ppc_frag_check): Declare.
* doc/c-ppc.texi: Document -mvle.
* NEWS: Mention PowerPC VLE port.
2012-05-14 Catherine Moore <clm@codesourcery.com>
gas/
* config/tc-ppc.h (ppc_dw2_line_min_insn_length): Declare.
(DWARF2_LINE_MIN_INSN_LENGTH): Redefine.
* config/tc-ppc.c (ppc_dw2_line_min_insn_length): New.
* dwarf2dbg.c (scale_addr_delta): Handle values of 1
for DWARF2_LINE_MIN_INSN_LENGTH.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
gas/testsuite/
* gas/ppc/ppc.exp: Run new tests.
* gas/ppc/vle-reloc.d: New test.
* gas/ppc/vle-reloc.s: New test.
* gas/ppc/vle-simple-1.d: New test.
* gas/ppc/vle-simple-1.s: New test.
* gas/ppc/vle-simple-2.d: New test.
* gas/ppc/vle-simple-2.s: New test.
* gas/ppc/vle-simple-3.d: New test.
* gas/ppc/vle-simple-3.s: New test.
* gas/ppc/vle-simple-4.d: New test.
* gas/ppc/vle-simple-4.s: New test.
* gas/ppc/vle-simple-5.d: New test.
* gas/ppc/vle-simple-5.s: New test.
* gas/ppc/vle-simple-6.d: New test.
* gas/ppc/vle-simple-6.s: New test.
* gas/ppc/vle.d: New test.
* gas/ppc/vle.s: New test.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
include/elf/
* ppc.h (SEC_PPC_VLE): Remove.
2012-05-14 Catherine Moore <clm@codesourcery.com>
James Lemke <jwlemke@codesourcery.com>
include/elf/
* ppc.h (R_PPC_VLE_REL8): New reloction.
(R_PPC_VLE_REL15): Likewise.
(R_PPC_VLE_REL24): Likewise.
(R_PPC_VLE_LO16A): Likewise.
(R_PPC_VLE_LO16D): Likewise.
(R_PPC_VLE_HI16A): Likewise.
(R_PPC_VLE_HI16D): Likewise.
(R_PPC_VLE_HA16A): Likewise.
(R_PPC_VLE_HA16D): Likewise.
(R_PPC_VLE_SDA21): Likewise.
(R_PPC_VLE_SDA21_LO): Likewise.
(R_PPC_VLE_SDAREL_LO16A): Likewise.
(R_PPC_VLE_SDAREL_LO16D): Likewise.
(R_PPC_VLE_SDAREL_HI16A): Likewise.
(R_PPC_VLE_SDAREL_HI16D): Likewise.
(R_PPC_VLE_SDAREL_HA16A): Likewise.
(R_PPC_VLE_SDAREL_HA16D): Likewise.
(SEC_PPC_VLE): Remove.
(PF_PPC_VLE): New program header flag.
(SHF_PPC_VLE): New section header flag.
(vle_opcodes, vle_num_opcodes): New.
(VLE_OP): New macro.
(VLE_OP_TO_SEG): New macro.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
include/opcode/
* ppc.h (PPC_OPCODE_VLE): New definition.
(PPC_OP_SA): New macro.
(PPC_OP_SE_VLE): New macro.
(PPC_OP): Use a variable shift amount.
(powerpc_operand): Update comments.
(PPC_OPSHIFT_INV): New macro.
(PPC_OPERAND_CR): Replace with...
(PPC_OPERAND_CR_BIT): ...this and
(PPC_OPERAND_CR_REG): ...this.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
ld/
* ldlang.c (walk_wild_consider_section): Don't copy section_flag_list.
Pass it to callback.
(walk_wild_section_general): Pass section_flag_list to callback.
(lang_add_section): Add sflag_list parm.
Move out logic to keep / omit a section & call bfd_lookup_section_flags.
(output_section_callback_fast): Add sflag_list parm.
Add new parm to lang_add_section calls.
(output_section_callback): Likewise.
(check_section_callback): Add sflag_list parm.
(lang_place_orphans): Add new parm to lang_add_section calls.
(gc_section_callback): Add sflag_list parm.
(find_relro_section_callback): Likewise.
* ldlang.h (callback_t): Add flag_info parm.
(lang_add_section): Add sflag_list parm.
* emultempl/armelf.em (elf32_arm_add_stub_section):
Add lang_add_section parm.
* emultempl/beos.em (gld*_place_orphan): Likewise.
* emultempl/elf32.em (gld*_place_orphan): Likewise.
* emultempl/hppaelf.em (hppaelf_add_stub_section): Likewise.
* emultempl/m68hc1xelf.em (m68hc11elf_add_stub_section): Likewise.
* emultempl/mipself.em (mips_add_stub_section): Likewise.
* emultempl/mmo.em (mmo_place_orphan): Likewise.
* emultempl/pe.em (gld_*_place_orphan): Likewise.
* emultempl/pep.em (gld_*_place_orphan): Likewise.
* emultempl/ppc64elf.em (ppc_add_stub_section): Likewise.
* emultempl/spuelf.em (spu_place_special_section): Likewise.
* emultempl/vms.em (vms_place_orphan): Likewise.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
ld/testsuite/
* ld-powerpc/powerpc.exp: Create ppceabitests.
* ld-powerpc/vle-multiseg.s: New.
* ld-powerpc/vle-multiseg-1.d: New.
* ld-powerpc/vle-multiseg-1.ld: New.
* ld-powerpc/vle-multiseg-2.d: New.
* ld-powerpc/vle-multiseg-2.ld: New.
* ld-powerpc/vle-multiseg-3.d: New.
* ld-powerpc/vle-multiseg-3.ld: New.
* ld-powerpc/vle-multiseg-4.d: New.
* ld-powerpc/vle-multiseg-4.ld: New.
* ld-powerpc/vle-multiseg-5.d: New.
* ld-powerpc/vle-multiseg-5.ld: New.
* ld-powerpc/vle-multiseg-6.d: New.
* ld-powerpc/vle-multiseg-6.ld: New.
* ld-powerpc/vle-multiseg-6a.s: New.
* ld-powerpc/vle-multiseg-6b.s: New.
* ld-powerpc/vle-multiseg-6c.s: New.
* ld-powerpc/vle-multiseg-6d.s: New.
* ld-powerpc/powerpc.exp: Run new tests.
2012-05-14 Catherine Moore <clm@codesourcery.com>
ld/
* NEWS: Mention PowerPC VLE port.
2012-05-14 Catherine Moore <clm@codesourcery.com>
ld/testsuite/
* ld-powerpc/apuinfo.rd: Update for VLE.
* ld-powerpc/vle-reloc-1.d: New.
* ld-powerpc/vle-reloc-1.s: New.
* ld-powerpc/vle-reloc-2.d: New.
* ld-powerpc/vle-reloc-2.s: New.
* ld-powerpc/vle-reloc-3.d: New.
* ld-powerpc/vle-reloc-3.s: New.
* ld-powerpc/vle-reloc-def-1.s: New.
* ld-powerpc/vle-reloc-def-2.s: New.
* ld-powerpc/vle-reloc-def-3.s: New.
2012-05-14 James Lemke <jwlemke@codesourcery.com>
opcodes/
* ppc-dis.c (get_powerpc_dialect): Use is_ppc_vle.
(PPC_OPCD_SEGS, VLE_OPCD_SEGS): New defines.
(vle_opcd_indices): New array.
(lookup_vle): New function.
(disassemble_init_powerpc): Revise for second (VLE) opcode table.
(print_insn_powerpc): Likewise.
* ppc-opc.c: Likewise.
2012-05-14 Catherine Moore <clm@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Rhonda Wittels <rhonda@codesourcery.com>
Nathan Froyd <froydnj@codesourcery.com>
opcodes/
* ppc-opc.c (insert_arx, extract_arx): New functions.
(insert_ary, extract_ary): New functions.
(insert_li20, extract_li20): New functions.
(insert_rx, extract_rx): New functions.
(insert_ry, extract_ry): New functions.
(insert_sci8, extract_sci8): New functions.
(insert_sci8n, extract_sci8n): New functions.
(insert_sd4h, extract_sd4h): New functions.
(insert_sd4w, extract_sd4w): New functions.
(insert_vlesi, extract_vlesi): New functions.
(insert_vlensi, extract_vlensi): New functions.
(insert_vleui, extract_vleui): New functions.
(insert_vleil, extract_vleil): New functions.
(BI_MASK, BB_MASK, BT): Use PPC_OPERAND_CR_BIT.
(BI16, BI32, BO32, B8): New.
(B15, B24, CRD32, CRS): New.
(CRD, OBF, BFA, CR, CRFS): Use PPC_OPERAND_CR_REG.
(DB, IMM20, RD, Rx, ARX, RY, RZ): New.
(ARY, SCLSCI8, SCLSCI8N, SE_SD, SE_SDH): New.
(SH6_MASK): Use PPC_OPSHIFT_INV.
(SI8, UI5, OIMM5, UI7, BO16): New.
(VLESIMM, VLENSIMM, VLEUIMM, VLEUIMML): New.
(XT6, XA6, XB6, XB6S, XC6): Use PPC_OPSHIFT_INV.
(ALLOW8_SPRG): New.
(insert_sprg, extract_sprg): Check ALLOW8_SPRG.
(OPVUP, OPVUP_MASK OPVUP): New
(BD8, BD8_MASK, BD8IO, BD8IO_MASK): New.
(EBD8IO, EBD8IO1_MASK, EBD8IO2_MASK, EBD8IO3_MASK): New.
(BD15, BD15_MASK, EBD15, EBD15_MASK, EBD15BI, EBD15BI_MASK): New.
(BD24,BD24_MASK, C_LK, C_LK_MASK, C, C_MASK): New.
(IA16, IA16_MASK, I16A, I16A_MASK, I16L, I16L_MASK): New.
(IM7, IM7_MASK, LI20, LI20_MASK, SCI8, SCI8_MASK): New.
(SCI8BF, SCI8BF_MASK, SD4, SD4_MASK): New.
(SE_IM5, SE_IM5_MASK): New.
(SE_R, SE_R_MASK, SE_RR, SE_RR_MASK): New.
(EX, EX_MASK, BO16F, BO16T, BO32F, BO32T): New.
(BO32DNZ, BO32DZ): New.
(NO371, PPCSPE, PPCISEL, PPCEFS, MULHW): Include PPC_OPCODE_VLE.
(PPCVLE): New.
(powerpc_opcodes): Add new VLE instructions. Update existing
instruction to include PPCVLE if supported.
* ppc-dis.c (ppc_opts): Add vle entry.
(get_powerpc_dialect): New function.
(powerpc_init_dialect): VLE support.
(print_insn_big_powerpc): Call get_powerpc_dialect.
(print_insn_little_powerpc): Likewise.
(operand_value_powerpc): Handle negative shift counts.
(print_insn_powerpc): Handle 2-byte instruction lengths.
2012-05-14 21:45:30 +02:00
|
|
|
struct flag_info *, lang_output_section_statement_type *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_new_phdr
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, etree_type *, bfd_boolean, bfd_boolean, etree_type *,
|
|
|
|
etree_type *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_nocrossref
|
2004-01-13 12:10:53 +01:00
|
|
|
(lang_nocrossref_type *);
|
2016-04-14 12:49:53 +02:00
|
|
|
extern void lang_add_nocrossref_to
|
|
|
|
(lang_nocrossref_type *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_enter_overlay
|
2003-07-27 13:58:28 +02:00
|
|
|
(etree_type *, etree_type *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_enter_overlay_section
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_leave_overlay_section
|
2004-01-13 12:10:53 +01:00
|
|
|
(fill_type *, lang_output_section_phdr_list *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_leave_overlay
|
2003-06-28 07:28:54 +02:00
|
|
|
(etree_type *, int, fill_type *, const char *,
|
2004-01-13 12:10:53 +01:00
|
|
|
lang_output_section_phdr_list *, const char *);
|
1999-05-03 09:29:11 +02:00
|
|
|
|
2002-02-14 05:24:33 +01:00
|
|
|
extern struct bfd_elf_version_expr *lang_new_vers_pattern
|
2005-10-13 19:29:57 +02:00
|
|
|
(struct bfd_elf_version_expr *, const char *, const char *, bfd_boolean);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern struct bfd_elf_version_tree *lang_new_vers_node
|
2003-06-28 07:28:54 +02:00
|
|
|
(struct bfd_elf_version_expr *, struct bfd_elf_version_expr *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern struct bfd_elf_version_deps *lang_add_vers_depend
|
2003-06-28 07:28:54 +02:00
|
|
|
(struct bfd_elf_version_deps *, const char *);
|
1999-05-03 09:29:11 +02:00
|
|
|
extern void lang_register_vers_node
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *, struct bfd_elf_version_tree *, struct bfd_elf_version_deps *);
|
2006-09-07 19:16:34 +02:00
|
|
|
extern void lang_append_dynamic_list (struct bfd_elf_version_expr *);
|
|
|
|
extern void lang_append_dynamic_list_cpp_typeinfo (void);
|
2007-01-16 15:56:32 +01:00
|
|
|
extern void lang_append_dynamic_list_cpp_new (void);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern void lang_add_unique
|
2003-06-28 07:28:54 +02:00
|
|
|
(const char *);
|
2002-12-08 04:56:04 +01:00
|
|
|
extern const char *lang_get_output_target
|
2003-06-28 07:28:54 +02:00
|
|
|
(void);
|
2004-10-16 20:13:54 +02:00
|
|
|
extern void add_excluded_libs (const char *);
|
2006-10-25 08:49:21 +02:00
|
|
|
extern bfd_boolean load_symbols
|
|
|
|
(lang_input_statement_type *, lang_statement_list_type *);
|
2004-10-16 20:13:54 +02:00
|
|
|
|
bfd, ld: add CTF section linking
This is quite complicated because the CTF section's contents depend on
the final contents of the symtab and strtab, because it has two sections
whose contents are shuffled to be in 1:1 correspondence with the symtab,
and an internal strtab that gets deduplicated against the ELF strtab
(with offsets adjusted to point into the ELF strtab instead). It is
also compressed if large enough, so its size depends on its contents!
So we cannot construct it as early as most sections: we cannot even
*begin* construction until after the symtab and strtab are finalized.
Thankfully there is already one section treated similarly: compressed
debugging sections: the only differences are that compressed debugging
sections have extra handling to deal with their changing name if
compressed (CTF sections are always called ".ctf" for now, though we
have reserved ".ctf.*" against future use), and that compressed
debugging sections have previously-uncompressed content which has to be
stashed away for later compression, while CTF sections have no content
at all until we generate it (very late).
BFD also cannot do the link itself: libctf knows how to do it, and BFD
cannot call libctf directly because libctf already depends on bfd for
file I/O. So we have to use a pair of callbacks, one, examine_strtab,
which allows a caller to examine the symtab and strtab after
finalization (called from elf_link_swap_symbols_out(), right before the
symtabs are written, and after the strtab has been finalized), and one
which actually does the emission (called emit_ctf simply because it is
grouped with a bunch of section-specific late-emission function calls at
the bottom of bfd_elf_final_link, and a section-specific name seems best
for that). emit_ctf is actually called *twice*: once from lang_process
if the emulation suggests that this bfd target does not examine the
symtab or strtab, and once via a bfd callback if it does. (This means
that non-ELF targets still get CTF emitted, even though the late CTF
emission stage is never called for them).
v2: merged with non-ELF support patch: slight commit message
adjustments.
v3: do not spend time merging CTF, or crash, if the CTF section is
explicitly discarded. Do not try to merge or compress CTF unless
linking.
v4: add CTF_COMPRESSION_THRESHOLD. Annul the freed input ctf_file_t's
after writeout: set SEC_IN_MEMORY on the output contents so a future
bfd enhancement knows it could free it. Add SEC_LINKER_CREATED |
SEC_KEEP to avoid having to add .ctf to the linker script. Drop
now-unnecessary ldlang.h-level elf-bfd.h include and hackery around
it. Adapt to elf32.em->elf.em and elf-generic.em->ldelf*.c
changes.
v5: fix tabdamage. Drop #inclusions in .h files: include in .c files,
.em files, and use struct forwards instead. Use bfd_section_is_ctf
inline function rather than SECTION_IS_CTF macro. Move a few
comments.
* Makefile.def (dependencies): all-ld depends on all-libctf.
* Makefile.in: Regenerated.
include/
* bfdlink.h (elf_strtab_hash): New forward.
(elf_sym_strtab): Likewise.
(struct bfd_link_callbacks <examine_strtab>): New.
(struct bfd_link_callbacks <emit_ctf>): Likewise.
bfd/
* elf-bfd.h (bfd_section_is_ctf): New inline function.
* elf.c (special_sections_c): Add ".ctf".
(assign_file_positions_for_non_load_sections): Note that
compressed debugging sections etc are not assigned here. Treat
CTF sections like SEC_ELF_COMPRESS sections when is_linker_output:
sh_offset -1.
(assign_file_positions_except_relocs): Likewise.
(find_section_in_list): Note that debugging and CTF sections, as
well as reloc sections, are assigned later.
(_bfd_elf_assign_file_positions_for_non_load): CTF sections get
their size and contents updated.
(_bfd_elf_set_section_contents): Skip CTF sections: unlike
compressed sections, they have no uncompressed content to copy at
this stage.
* elflink.c (elf_link_swap_symbols_out): Call the examine_strtab
callback right before the strtab is written out.
(bfd_elf_final_link): Don't cache the section contents of CTF
sections: they are not populated yet. Call the emit_ctf callback
right at the end, after all the symbols and strings are flushed
out.
ld/
* ldlang.h: (struct lang_input_statement_struct): Add the_ctf.
(struct elf_sym_strtab): Add forward.
(struct elf_strtab_hash): Likewise.
(ldlang_ctf_apply_strsym): Declare.
(ldlang_write_ctf_late): Likewise.
* ldemul.h (ldemul_emit_ctf_early): New.
(ldemul_examine_strtab_for_ctf): Likewise.
(ld_emulation_xfer_type) <emit_ctf_early>: Likewise.
(ld_emulation_xfer_type) <examine_strtab_for_ctf>: Likewise.
* ldemul.c (ldemul_emit_ctf_early): New.
(ldemul_examine_strtab_for_ctf): Likewise.
* ldlang.c: Include ctf-api.h.
(CTF_COMPRESSION_THRESHOLD): New.
(ctf_output): New. Initialized in...
(ldlang_open_ctf): ... this new function. Open all the CTF
sections in the input files: mark them non-loaded and empty
so as not to copy their contents to the output, but linker-created
so the section gets created in the target.
(ldlang_merge_ctf): New, merge types via ctf_link_add_ctf and
ctf_link.
(ldlang_ctf_apply_strsym): New, an examine_strtab callback: wrap
ldemul_examine_strtab_for_ctf.
(lang_write_ctf): New, write out the CTF section.
(ldlang_write_ctf_late): New, late call via bfd's emit_ctf hook.
(lang_process): Call ldlang_open_ctf, ldlang_merge_ctf, and
lang_write_ctf.
* ldmain.c (link_callbacks): Add ldlang_ctf_apply_strsym,
ldlang_write_ctf_late.
* emultempl/aix.em: Add ctf-api.h.
* emultempl/armcoff.em: Likewise.
* emultempl/beos.em: Likewise.
* emultempl/elf.em: Likewise.
* emultempl/generic.em: Likewise.
* emultempl/linux.em: Likewise.
* emultempl/msp430.em: Likewise.
* emultempl/pe.em: Likewise.
* emultempl/pep.em: Likewise.
* emultempl/ticoff.em: Likewise.
* emultempl/vanilla.em: Likewise.
* ldcref.c: Likewise.
* ldctor.c: Likewise.
* ldelf.c: Likewise.
* ldelfgen.c: Likewise.
* ldemul.c: Likewise.
* ldexp.c: Likewise.
* ldfile.c: Likewise.
* ldgram.c: Likewise.
* ldlex.l: Likewise.
* ldmain.c: Likewise.
* ldmisc.c: Likewise.
* ldver.c: Likewise.
* ldwrite.c: Likewise.
* lexsup.c: Likewise.
* mri.c: Likewise.
* pe-dll.c: Likewise.
* plugin.c: Likewise.
* ldelfgen.c (ldelf_emit_ctf_early): New.
(ldelf_examine_strtab_for_ctf): tell libctf about the symtab and
strtab.
(struct ctf_strsym_iter_cb_arg): New, state to do so.
(ldelf_ctf_strtab_iter_cb): New: tell libctf about
each string in the strtab in turn.
(ldelf_ctf_symbols_iter_cb): New, tell libctf
about each symbol in the symtab in turn.
* ldelfgen.h (struct elf_sym_strtab): Add forward.
(struct elf_strtab_hash): Likewise.
(struct ctf_file): Likewise.
(ldelf_emit_ctf_early): Declare.
(ldelf_examine_strtab_for_ctf): Likewise.
* emultempl/elf-generic.em (LDEMUL_EMIT_CTF_EARLY): Set it.
(LDEMUL_EXAMINE_STRTAB_FOR_CTF): Likewise.
* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Add
emit_ctf_early and examine_strtab_for_ctf, NULL by default.
* emultempl/armcoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/beos.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/generic.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/linux.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/msp430.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pe.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/pep.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/ticoff.em (ld_${EMULATION_NAME}_emulation): Likewise.
* emultempl/vanilla.em (ld_vanilla_emulation): Likewise.
* Makefile.am: Pull in libctf (and zlib, a transitive requirement
for compressed CTF section emission). Pass it on to DejaGNU.
* configure.ac: Add AM_ZLIB.
* aclocal.m4: Added zlib.m4.
* Makefile.in: Regenerated.
* testsuite/ld-bootstrap/bootstrap.exp: Use it when relinking ld.
2019-07-13 23:38:00 +02:00
|
|
|
struct elf_sym_strtab;
|
|
|
|
struct elf_strtab_hash;
|
|
|
|
extern void ldlang_ctf_apply_strsym
|
|
|
|
(struct elf_sym_strtab *, bfd_size_type, struct elf_strtab_hash *);
|
|
|
|
extern void ldlang_write_ctf_late
|
|
|
|
(void);
|
2007-02-21 17:43:50 +01:00
|
|
|
extern bfd_boolean
|
|
|
|
ldlang_override_segment_assignment
|
|
|
|
(struct bfd_link_info *, bfd *, asection *, asection *, bfd_boolean);
|
|
|
|
|
2011-01-13 14:29:55 +01:00
|
|
|
extern void
|
|
|
|
lang_ld_feature (char *);
|
|
|
|
|
2015-06-05 15:09:31 +02:00
|
|
|
extern void
|
|
|
|
lang_print_memory_usage (void);
|
|
|
|
|
2016-03-22 13:25:08 +01:00
|
|
|
extern void
|
|
|
|
lang_add_gc_name (const char *);
|
|
|
|
|
1999-05-03 09:29:11 +02:00
|
|
|
#endif
|