Line 59... |
Line 59... |
static int no_multi_toc = 0;
|
static int no_multi_toc = 0;
|
|
|
/* Whether to sort input toc and got sections. */
|
/* Whether to sort input toc and got sections. */
|
static int no_toc_sort = 0;
|
static int no_toc_sort = 0;
|
|
|
|
/* Set if PLT call stubs should load r11. */
|
|
static int plt_static_chain = 0;
|
|
|
/* Whether to emit symbols for stubs. */
|
/* Whether to emit symbols for stubs. */
|
static int emit_stub_syms = -1;
|
static int emit_stub_syms = -1;
|
|
|
static asection *toc_section = 0;
|
static asection *toc_section = 0;
|
|
|
Line 498... |
Line 501... |
|
|
if (!ppc64_elf_check_init_fini (&link_info))
|
if (!ppc64_elf_check_init_fini (&link_info))
|
einfo ("%P: .init/.fini fragments use differing TOC pointers\n");
|
einfo ("%P: .init/.fini fragments use differing TOC pointers\n");
|
|
|
/* Call into the BFD backend to do the real work. */
|
/* Call into the BFD backend to do the real work. */
|
if (!ppc64_elf_size_stubs (&link_info, group_size))
|
if (!ppc64_elf_size_stubs (&link_info, group_size, plt_static_chain))
|
einfo ("%X%P: can not size stub section: %E\n");
|
einfo ("%X%P: can not size stub section: %E\n");
|
}
|
}
|
}
|
}
|
|
|
if (need_laying_out != -1)
|
if (need_laying_out != -1)
|
Line 647... |
Line 650... |
fi
|
fi
|
|
|
# Define some shell vars to insert bits of code into the standard elf
|
# Define some shell vars to insert bits of code into the standard elf
|
# parse_args and list_options functions.
|
# parse_args and list_options functions.
|
#
|
#
|
PARSE_AND_LIST_PROLOGUE='
|
PARSE_AND_LIST_PROLOGUE=${PARSE_AND_LIST_PROLOGUE}'
|
#define OPTION_STUBGROUP_SIZE 301
|
#define OPTION_STUBGROUP_SIZE 321
|
#define OPTION_STUBSYMS (OPTION_STUBGROUP_SIZE + 1)
|
#define OPTION_PLT_STATIC_CHAIN (OPTION_STUBGROUP_SIZE + 1)
|
|
#define OPTION_NO_PLT_STATIC_CHAIN (OPTION_PLT_STATIC_CHAIN + 1)
|
|
#define OPTION_STUBSYMS (OPTION_NO_PLT_STATIC_CHAIN + 1)
|
#define OPTION_NO_STUBSYMS (OPTION_STUBSYMS + 1)
|
#define OPTION_NO_STUBSYMS (OPTION_STUBSYMS + 1)
|
#define OPTION_DOTSYMS (OPTION_NO_STUBSYMS + 1)
|
#define OPTION_DOTSYMS (OPTION_NO_STUBSYMS + 1)
|
#define OPTION_NO_DOTSYMS (OPTION_DOTSYMS + 1)
|
#define OPTION_NO_DOTSYMS (OPTION_DOTSYMS + 1)
|
#define OPTION_NO_TLS_OPT (OPTION_NO_DOTSYMS + 1)
|
#define OPTION_NO_TLS_OPT (OPTION_NO_DOTSYMS + 1)
|
#define OPTION_NO_TLS_GET_ADDR_OPT (OPTION_NO_TLS_OPT + 1)
|
#define OPTION_NO_TLS_GET_ADDR_OPT (OPTION_NO_TLS_OPT + 1)
|
Line 662... |
Line 667... |
#define OPTION_NO_MULTI_TOC (OPTION_NO_TOC_OPT + 1)
|
#define OPTION_NO_MULTI_TOC (OPTION_NO_TOC_OPT + 1)
|
#define OPTION_NO_TOC_SORT (OPTION_NO_MULTI_TOC + 1)
|
#define OPTION_NO_TOC_SORT (OPTION_NO_MULTI_TOC + 1)
|
#define OPTION_NON_OVERLAPPING_OPD (OPTION_NO_TOC_SORT + 1)
|
#define OPTION_NON_OVERLAPPING_OPD (OPTION_NO_TOC_SORT + 1)
|
'
|
'
|
|
|
PARSE_AND_LIST_LONGOPTS='
|
PARSE_AND_LIST_LONGOPTS=${PARSE_AND_LIST_LONGOPTS}'
|
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
|
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
|
|
{ "plt-static-chain", no_argument, NULL, OPTION_PLT_STATIC_CHAIN },
|
|
{ "no-plt-static-chain", no_argument, NULL, OPTION_NO_PLT_STATIC_CHAIN },
|
{ "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
|
{ "emit-stub-syms", no_argument, NULL, OPTION_STUBSYMS },
|
{ "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
|
{ "no-emit-stub-syms", no_argument, NULL, OPTION_NO_STUBSYMS },
|
{ "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
|
{ "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
|
{ "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
|
{ "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
|
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
|
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
|
Line 677... |
Line 684... |
{ "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
|
{ "no-multi-toc", no_argument, NULL, OPTION_NO_MULTI_TOC },
|
{ "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
|
{ "no-toc-sort", no_argument, NULL, OPTION_NO_TOC_SORT },
|
{ "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
|
{ "non-overlapping-opd", no_argument, NULL, OPTION_NON_OVERLAPPING_OPD },
|
'
|
'
|
|
|
PARSE_AND_LIST_OPTIONS='
|
PARSE_AND_LIST_OPTIONS=${PARSE_AND_LIST_OPTIONS}'
|
fprintf (file, _("\
|
fprintf (file, _("\
|
--stub-group-size=N Maximum size of a group of input sections that\n\
|
--stub-group-size=N Maximum size of a group of input sections that\n\
|
can be handled by one stub section. A negative\n\
|
can be handled by one stub section. A negative\n\
|
value locates all stubs before their branches\n\
|
value locates all stubs before their branches\n\
|
(with a group size of -N), while a positive\n\
|
(with a group size of -N), while a positive\n\
|
Line 689... |
Line 696... |
before, and one after each stub section.\n\
|
before, and one after each stub section.\n\
|
Values of +/-1 indicate the linker should\n\
|
Values of +/-1 indicate the linker should\n\
|
choose suitable defaults.\n"
|
choose suitable defaults.\n"
|
));
|
));
|
fprintf (file, _("\
|
fprintf (file, _("\
|
|
--plt-static-chain PLT call stubs should load r11.\n"
|
|
));
|
|
fprintf (file, _("\
|
|
--no-plt-static-chain PLT call stubs should not load r11. (default)\n"
|
|
));
|
|
fprintf (file, _("\
|
--emit-stub-syms Label linker stubs with a symbol.\n"
|
--emit-stub-syms Label linker stubs with a symbol.\n"
|
));
|
));
|
fprintf (file, _("\
|
fprintf (file, _("\
|
--no-emit-stub-syms Don'\''t label linker stubs with a symbol.\n"
|
--no-emit-stub-syms Don'\''t label linker stubs with a symbol.\n"
|
));
|
));
|
Line 727... |
Line 740... |
--non-overlapping-opd Canonicalize .opd, so that there are no\n\
|
--non-overlapping-opd Canonicalize .opd, so that there are no\n\
|
overlapping .opd entries.\n"
|
overlapping .opd entries.\n"
|
));
|
));
|
'
|
'
|
|
|
PARSE_AND_LIST_ARGS_CASES='
|
PARSE_AND_LIST_ARGS_CASES=${PARSE_AND_LIST_ARGS_CASES}'
|
case OPTION_STUBGROUP_SIZE:
|
case OPTION_STUBGROUP_SIZE:
|
{
|
{
|
const char *end;
|
const char *end;
|
group_size = bfd_scan_vma (optarg, &end, 0);
|
group_size = bfd_scan_vma (optarg, &end, 0);
|
if (*end)
|
if (*end)
|
einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
|
einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
|
}
|
}
|
break;
|
break;
|
|
|
|
case OPTION_PLT_STATIC_CHAIN:
|
|
plt_static_chain = 1;
|
|
break;
|
|
|
|
case OPTION_NO_PLT_STATIC_CHAIN:
|
|
plt_static_chain = 0;
|
|
break;
|
|
|
case OPTION_STUBSYMS:
|
case OPTION_STUBSYMS:
|
emit_stub_syms = 1;
|
emit_stub_syms = 1;
|
break;
|
break;
|
|
|
case OPTION_NO_STUBSYMS:
|
case OPTION_NO_STUBSYMS:
|