.plt stub for lazy linking, --stub-group-size=N ld switch,

import stub fix, extra DIR14F reloc to fix abort in tc_gen_reloc
This commit is contained in:
Alan Modra
2000-09-27 17:30:19 +00:00
parent 5506e1a5d8
commit 47d89dba5e
10 changed files with 300 additions and 86 deletions

View File

@@ -1,3 +1,15 @@
2000-09-28 Alan Modra <alan@linuxcare.com.au>
* ld.texinfo (HPPA ELF32): New section.
* emultempl/hppaelf.em (group_size): New.
(hppaelf_finish): Pass group_size to elf32_hppa_size_stubs.
(PARSE_AND_LIST_PROLOGUE): Add OPTION_STUBGROUP_SIZE.
(PARSE_AND_LIST_LONGOPTS): Add --stub-group-size. Duplicate
options to prevent abbreviations matching.
(PARSE_AND_LIST_OPTIONS): Describe the above. Reformat.
(PARSE_AND_LIST_ARGS_CASES): Handle it.
2000-09-21 Michael Sokolov <msokolov@ivan.Harhan.ORG>
* emultempl/m68kelf.em: Conditionalise the embedded relocs feature

View File

@@ -44,6 +44,10 @@ static lang_input_statement_type *stub_file;
stubs. */
static int multi_subspace = 0;
/* Maximum size of a group of input sections that can be handled by
one stub section. A value of +/-1 indicates the bfd back-end
should use a suitable default size. */
static bfd_signed_vma group_size = 1;
/* This is called before the input files are opened. We create a new
fake input file to hold the stub sections. */
@@ -292,6 +296,7 @@ hppaelf_finish ()
stub_file->the_bfd,
&link_info,
multi_subspace,
group_size,
&hppaelf_add_stub_section,
&hppaelf_layaout_sections_again))
{
@@ -349,16 +354,31 @@ EOF
#
PARSE_AND_LIST_PROLOGUE='
#define OPTION_MULTI_SUBSPACE 301
#define OPTION_STUBGROUP_SIZE (OPTION_MULTI_SUBSPACE + 1)
'
# The options are repeated below so that no abbreviations are allowed.
# Otherwise -s matches stub-group-size
PARSE_AND_LIST_LONGOPTS='
{ "multi-subspace", no_argument, NULL, OPTION_MULTI_SUBSPACE},
{ "multi-subspace", no_argument, NULL, OPTION_MULTI_SUBSPACE },
{ "multi-subspace", no_argument, NULL, OPTION_MULTI_SUBSPACE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
'
PARSE_AND_LIST_OPTIONS='
fprintf (file, _("\
--multi-subspace Generate import and export stubs to support\n\
multiple sub-space shared libraries\n"
--multi-subspace Generate import and export stubs to support\n\
multiple sub-space shared libraries\n"
));
fprintf (file, _("\
--stub-group-size=N Maximum size of a group of input sections that can be\n\
handled by one stub section. A negative value\n\
locates all stubs before their branches (with a\n\
group size of -N), while a positive value allows\n\
two groups of input sections, one before, and one\n\
after each stub section. Values of +/-1 indicate\n\
the linker should choose suitable defaults."
));
'
@@ -366,6 +386,15 @@ PARSE_AND_LIST_ARGS_CASES='
case OPTION_MULTI_SUBSPACE:
multi_subspace = 1;
break;
case OPTION_STUBGROUP_SIZE:
{
const char *end;
group_size = bfd_scan_vma (optarg, &end, 0);
if (*end)
einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
}
break;
'
# Put these extra hppaelf routines in ld_${EMULATION_NAME}_emulation

View File

@@ -3904,6 +3904,7 @@ functionality are not listed.
* H8/300:: @code{ld} and the H8/300
* i960:: @code{ld} and the Intel 960 family
* ARM:: @code{ld} and the ARM family
* HPPA ELF32:: @code{ld} and HPPA 32-bit ELF
@ifset TICOFF
* TI COFF:: @code{ld} and TI COFF
@end ifset
@@ -4047,6 +4048,38 @@ But it also sets the bottom bit of the address, so that it can be
branched to using a BX instruction, and the program will start
executing in Thumb mode straight away.
@node HPPA ELF32
@section @code{ld} and HPPA 32-bit ELF support
@cindex HPPA multiple sub-space stubs
@kindex --multi-subspace
When generating a shared library, @code{ld} will by default generate
import stubs suitable for use with a single sub-space application.
The @samp{--multi-subspace} switch causes @code{ld} to generate export
stubs, and different (larger) import stubs suitable for use with
multiple sub-spaces.
@cindex HPPA stub grouping
@kindex --stub-group-size=@var{N}
Long branch stubs and import/export stubs are placed by @code{ld} in
stub sections located between groups of input sections.
@samp{--stub-group-size} specifies the maximum size of a group of input
sections handled by one stub section. Since branch offsets are signed,
a stub section may serve two groups of input sections, one group before
the stub section, and one group after it. However, when using
conditional branches that require stubs, it may be better (for branch
prediction) that stub sections only serve one group of input sections.
A negative value for @samp{N} chooses this scheme, ensuring that
branches to stubs always use a negative offset. Two special values of
@samp{N} are recognized, @samp{1} and @samp{-1}. These both instruct
@code{ld} to automatically size input section groups for the branch types
detected, with the same behaviour regarding stub placement as other
positive or negative values of @samp{N} respectively.
Note that @samp{--stub-group-size} does not split input sections. A
single input section larger than the group size specified will of course
create a larger group (of one section). If input sections are too
large, it may not be possible for a branch to reach its stub.
@ifset TICOFF
@node TI COFF
@section @code{ld}'s support for various TI COFF versions