* ldemul.c (ldemul_new_vers_pattern): New function.

* ldemul.h (ldemul_new_vers_pattern): Declare.
	(struct ld_emulation_xfer_struct): Add new_vers_pattern.
	* ldlang.c (lang_new_vers_pattern): Call ldemul_new_vers_pattern.
	* emultempl/ppc64elf.em (dotsyms): New static var.
	(gld${EMULATION_NAME}_new_vers_pattern): New function.
	(LDEMUL_NEW_VERS_PATTERN): Define.
	(PARSE_AND_LIST_PROLOGUE): Add OPTION_DOTSYMS, OPTION_NO_DOTSYMS.
	(PARSE_AND_LIST_LONGOPTS): Likewise.
	(PARSE_AND_LIST_ARGS_CASES): Handle them.
	* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Update
	initialiser.
	* emultempl/armcoff.em: Likewise.
	* emultempl/armelf_oabi.em: Likewise.
	* emultempl/beos.em: Likewise.
	* emultempl/elf32.em: Likewise.
	* emultempl/generic.em: Likewise.
	* emultempl/gld960.em: Likewise.
	* emultempl/gld960c.em: Likewise.
	* emultempl/linux.em: Likewise.
	* emultempl/lnk960.em: Likewise.
	* emultempl/m68kcoff.em: Likewise.
	* emultempl/mipsecoff.em: Likewise.
	* emultempl/pe.em: Likewise.
	* emultempl/sunos.em: Likewise.
	* emultempl/ticoff.em: Likewise.
	* emultempl/vanilla.em: Likewise.
This commit is contained in:
Alan Modra 2002-05-22 09:04:48 +00:00
parent eb3d6bb8dc
commit fac1652d6b
21 changed files with 182 additions and 15 deletions

View File

@ -1,3 +1,33 @@
2002-05-22 Alan Modra <amodra@bigpond.net.au>
* ldemul.c (ldemul_new_vers_pattern): New function.
* ldemul.h (ldemul_new_vers_pattern): Declare.
(struct ld_emulation_xfer_struct): Add new_vers_pattern.
* ldlang.c (lang_new_vers_pattern): Call ldemul_new_vers_pattern.
* emultempl/ppc64elf.em (dotsyms): New static var.
(gld${EMULATION_NAME}_new_vers_pattern): New function.
(LDEMUL_NEW_VERS_PATTERN): Define.
(PARSE_AND_LIST_PROLOGUE): Add OPTION_DOTSYMS, OPTION_NO_DOTSYMS.
(PARSE_AND_LIST_LONGOPTS): Likewise.
(PARSE_AND_LIST_ARGS_CASES): Handle them.
* emultempl/aix.em (ld_${EMULATION_NAME}_emulation): Update
initialiser.
* emultempl/armcoff.em: Likewise.
* emultempl/armelf_oabi.em: Likewise.
* emultempl/beos.em: Likewise.
* emultempl/elf32.em: Likewise.
* emultempl/generic.em: Likewise.
* emultempl/gld960.em: Likewise.
* emultempl/gld960c.em: Likewise.
* emultempl/linux.em: Likewise.
* emultempl/lnk960.em: Likewise.
* emultempl/m68kcoff.em: Likewise.
* emultempl/mipsecoff.em: Likewise.
* emultempl/pe.em: Likewise.
* emultempl/sunos.em: Likewise.
* emultempl/ticoff.em: Likewise.
* emultempl/vanilla.em: Likewise.
2002-05-22 Alan Modra <amodra@bigpond.net.au>
* genscripts.sh (LIB_PATH): For native targets, concatenate $libdir

View File

@ -1375,5 +1375,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
NULL, /* list_options */
NULL, /* recognized_file */
NULL, /* find potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -289,6 +289,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognised file */
gld${EMULATION_NAME}_list_options,
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -174,6 +174,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -874,6 +874,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -1659,5 +1659,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
${LDEMUL_RECOGNIZED_FILE-NULL},
${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
${LDEMUL_NEW_VERS_PATTERN-NULL}
};
EOF

View File

@ -144,6 +144,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
${LDEMUL_UNRECOGNIZED_FILE-NULL},
${LDEMUL_LIST_OPTIONS-NULL},
${LDEMUL_RECOGNIZED_FILE-NULL},
${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL}
${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
${LDEMUL_NEW_VERS_PATTERN-NULL}
};
EOF

View File

@ -189,6 +189,7 @@ struct ld_emulation_xfer_struct ld_gld960_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -204,6 +204,7 @@ struct ld_emulation_xfer_struct ld_gld960coff_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -221,6 +221,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -345,6 +345,7 @@ struct ld_emulation_xfer_struct ld_lnk960_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -240,6 +240,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -255,6 +255,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -1937,6 +1937,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
gld_${EMULATION_NAME}_unrecognized_file,
gld_${EMULATION_NAME}_list_options,
gld_${EMULATION_NAME}_recognized_file,
gld_${EMULATION_NAME}_find_potential_libraries
gld_${EMULATION_NAME}_find_potential_libraries,
NULL /* new_vers_pattern */
};
EOF

View File

@ -38,11 +38,16 @@ static int need_laying_out = 0;
should use a suitable default size. */
static bfd_signed_vma group_size = 1;
/* Whether to add ".foo" entries for each "foo" in a version script. */
static int dotsyms = 1;
static void ppc_create_output_section_statements PARAMS ((void));
static asection *ppc_add_stub_section PARAMS ((const char *, asection *));
static void ppc_layout_sections_again PARAMS ((void));
static void gld${EMULATION_NAME}_after_allocation PARAMS ((void));
static void build_section_lists PARAMS ((lang_statement_union_type *));
static struct bfd_elf_version_expr *gld${EMULATION_NAME}_new_vers_pattern
PARAMS ((struct bfd_elf_version_expr *));
/* This is called before the input files are opened. We create a new
fake input file to hold the stub sections. */
@ -242,6 +247,7 @@ build_section_lists (statement)
}
}
/* Final emulation specific call. */
static void
@ -301,6 +307,77 @@ gld${EMULATION_NAME}_finish ()
}
/* Add a pattern matching ".foo" for every "foo" in a version script.
The reason for doing this is that many shared library version
scripts export a selected set of functions or data symbols, forcing
others local. eg.
. VERS_1 {
. global:
. this; that; some; thing;
. local:
. *;
. };
To make the above work for PowerPC64, we need to export ".this",
".that" and so on, otherwise only the function descriptor syms are
exported. Lack of an exported function code sym may cause a
definition to be pulled in from a static library. */
struct bfd_elf_version_expr *
gld${EMULATION_NAME}_new_vers_pattern (entry)
struct bfd_elf_version_expr *entry;
{
struct bfd_elf_version_expr *dot_entry;
struct bfd_elf_version_expr *next;
unsigned int len;
char *dot_pat;
if (!dotsyms || entry->pattern[0] == '*')
return entry;
/* Is the script adding ".foo" explicitly? */
if (entry->pattern[0] == '.')
{
/* We may have added this pattern automatically. Don't add it
again. Quadratic behaviour here is acceptable as the list
may be traversed for each input bfd symbol. */
for (next = entry->next; next != NULL; next = next->next)
{
if (strcmp (next->pattern, entry->pattern) == 0
&& next->match == entry->match)
{
next = entry->next;
free (entry->pattern);
free (entry);
return next;
}
}
return entry;
}
/* Don't add ".foo" if the script has already done so. */
for (next = entry->next; next != NULL; next = next->next)
{
if (next->pattern[0] == '.'
&& strcmp (next->pattern + 1, entry->pattern) == 0
&& next->match == entry->match)
return entry;
}
dot_entry = (struct bfd_elf_version_expr *) xmalloc (sizeof *dot_entry);
dot_entry->next = entry;
len = strlen (entry->pattern) + 2;
dot_pat = xmalloc (len);
dot_pat[0] = '.';
memcpy (dot_pat + 1, entry->pattern, len - 1);
dot_entry->pattern = dot_pat;
dot_entry->match = entry->match;
return dot_entry;
}
/* Avoid processing the fake stub_file in vercheck, stat_needed and
check_needed routines. */
@ -335,6 +412,8 @@ EOF
#
PARSE_AND_LIST_PROLOGUE='
#define OPTION_STUBGROUP_SIZE 301
#define OPTION_DOTSYMS (OPTION_STUBGROUP_SIZE + 1)
#define OPTION_NO_DOTSYMS (OPTION_DOTSYMS + 1)
'
# The options are repeated below so that no abbreviations are allowed.
@ -342,6 +421,10 @@ PARSE_AND_LIST_PROLOGUE='
PARSE_AND_LIST_LONGOPTS='
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "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 },
'
PARSE_AND_LIST_OPTIONS='
@ -354,6 +437,15 @@ PARSE_AND_LIST_OPTIONS='
after each stub section. Values of +/-1 indicate\n\
the linker should choose suitable defaults.\n"
));
fprintf (file, _("\
--dotsyms For every version pattern \"foo\" in a version script,\n\
add \".foo\" so that function code symbols are\n\
treated the same as function descriptor symbols.\n\
Defaults to on.\n"
));
fprintf (file, _("\
--no-dotsyms Don'\''t do anything special in version scripts.\n"
));
'
PARSE_AND_LIST_ARGS_CASES='
@ -365,6 +457,18 @@ PARSE_AND_LIST_ARGS_CASES='
einfo (_("%P%F: invalid number `%s'\''\n"), optarg);
}
break;
case OPTION_DOTSYMS:
{
dotsyms = 1;
}
break;
case OPTION_NO_DOTSYMS:
{
dotsyms = 0;
}
break;
'
# Put these extra ppc64elf routines in ld_${EMULATION_NAME}_emulation
@ -372,3 +476,4 @@ PARSE_AND_LIST_ARGS_CASES='
LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
LDEMUL_FINISH=gld${EMULATION_NAME}_finish
LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=ppc_create_output_section_statements
LDEMUL_NEW_VERS_PATTERN=gld${EMULATION_NAME}_new_vers_pattern

View File

@ -1050,6 +1050,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -197,6 +197,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* unrecognized_file */
gld_${EMULATION_NAME}_list_options,
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -82,6 +82,7 @@ struct ld_emulation_xfer_struct ld_vanilla_emulation =
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */
NULL /* find_potential_libraries */
NULL, /* find_potential_libraries */
NULL /* new_vers_pattern */
};
EOF

View File

@ -308,3 +308,12 @@ ldemul_find_potential_libraries (name, entry)
return 0;
}
struct bfd_elf_version_expr *
ldemul_new_vers_pattern (entry)
struct bfd_elf_version_expr *entry;
{
if (ld_emulation->new_vers_pattern)
entry = (*ld_emulation->new_vers_pattern) (entry);
return entry;
}

View File

@ -53,6 +53,8 @@ extern void syslib_default PARAMS ((char*));
extern void hll_default PARAMS ((char*));
extern int ldemul_find_potential_libraries
PARAMS ((char *, struct lang_input_statement_struct *));
extern struct bfd_elf_version_expr *ldemul_new_vers_pattern
PARAMS ((struct bfd_elf_version_expr *));
typedef struct ld_emulation_xfer_struct {
/* Run before parsing the command line and script file.
@ -139,6 +141,11 @@ typedef struct ld_emulation_xfer_struct {
int (* find_potential_libraries)
PARAMS ((char *, struct lang_input_statement_struct *));
/* Called when adding a new version pattern. PowerPC64-ELF uses
this hook to add a pattern matching ".foo" for every "foo". */
struct bfd_elf_version_expr * (*new_vers_pattern)
PARAMS ((struct bfd_elf_version_expr *));
} ld_emulation_xfer_type;
typedef enum {

View File

@ -5083,7 +5083,7 @@ lang_new_vers_pattern (orig, new, lang)
ret->match = lang_vers_match_lang_c;
}
return ret;
return ldemul_new_vers_pattern (ret);
}
/* This is called for each set of variable names and match