Remove search path from -l:namespec DT_NEEDED
For libraries without a soname, -l:libfoo.so set DT_NEEDED to the search dir plus filename, while gold and -lfoo just use the filename. This patch fixes the inconsistency. * ldlang.h (full_name_provided): New input flag. * ldlang.c (new_afile): Don't use lang_input_file_is_search_file_enum for -l:namespec. Instead use lang_input_file_is_l_enum with full_name_provided flag. * ldlfile.c (ldfile_open_file_search): Don't complete lib name if full_name_provided flag is set. * emultempl/elf32.em (gld${EMULATION_NAME}_open_dynamic_archive): Handle full_name_provided libraries. Tidy EXTRA_SHLIB_EXTENSION support. Set DT_NEEDED for -l:namespec as namespec. * emultempl/aix.em (ppc_after_open_output): Handle full_name_provided. * emultempl/linux.em (gld${EMULATION_NAME}_open_dynamic_archive): Don't handle full_name_provided libraries. * emultempl/pe.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto. * emultempl/pep.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto. * emultempl/vms.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto.
This commit is contained in:
parent
d6b6434614
commit
d4ae5fb0b5
19
ld/ChangeLog
19
ld/ChangeLog
@ -1,3 +1,22 @@
|
|||||||
|
2014-03-14 Romain Geissler <romain.geissler@amadeus.com>
|
||||||
|
Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* ldlang.h (full_name_provided): New input flag.
|
||||||
|
* ldlang.c (new_afile): Don't use lang_input_file_is_search_file_enum
|
||||||
|
for -l:namespec. Instead use lang_input_file_is_l_enum with
|
||||||
|
full_name_provided flag.
|
||||||
|
* ldlfile.c (ldfile_open_file_search): Don't complete lib name if
|
||||||
|
full_name_provided flag is set.
|
||||||
|
* emultempl/elf32.em (gld${EMULATION_NAME}_open_dynamic_archive):
|
||||||
|
Handle full_name_provided libraries. Tidy EXTRA_SHLIB_EXTENSION
|
||||||
|
support. Set DT_NEEDED for -l:namespec as namespec.
|
||||||
|
* emultempl/aix.em (ppc_after_open_output): Handle full_name_provided.
|
||||||
|
* emultempl/linux.em (gld${EMULATION_NAME}_open_dynamic_archive):
|
||||||
|
Don't handle full_name_provided libraries.
|
||||||
|
* emultempl/pe.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto.
|
||||||
|
* emultempl/pep.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto.
|
||||||
|
* emultempl/vms.em (gld${EMULATION_NAME}_open_dynamic_archive): Ditto.
|
||||||
|
|
||||||
2014-03-12 Alan Modra <amodra@gmail.com>
|
2014-03-12 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* Makefile.in: Regenerate.
|
* Makefile.in: Regenerate.
|
||||||
|
@ -1509,7 +1509,13 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch,
|
|||||||
if (!entry->flags.maybe_archive)
|
if (!entry->flags.maybe_archive)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
path = concat (search->name, "/lib", entry->filename, arch, ".a", NULL);
|
if (entry->flags.full_name_provided)
|
||||||
|
path = concat (search->name, "/", entry->filename,
|
||||||
|
(const char *) NULL);
|
||||||
|
else
|
||||||
|
path = concat (search->name, "/lib", entry->filename, arch, ".a",
|
||||||
|
(const char *) NULL);
|
||||||
|
|
||||||
if (!ldfile_try_open_bfd (path, entry))
|
if (!ldfile_try_open_bfd (path, entry))
|
||||||
{
|
{
|
||||||
free (path);
|
free (path);
|
||||||
|
@ -1656,42 +1656,46 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
|||||||
{
|
{
|
||||||
const char *filename;
|
const char *filename;
|
||||||
char *string;
|
char *string;
|
||||||
|
size_t len;
|
||||||
|
bfd_boolean opened = FALSE;
|
||||||
|
|
||||||
if (! entry->flags.maybe_archive)
|
if (! entry->flags.maybe_archive)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
filename = entry->filename;
|
filename = entry->filename;
|
||||||
|
len = strlen (search->name) + strlen (filename);
|
||||||
/* This allocates a few bytes too many when EXTRA_SHLIB_EXTENSION
|
if (entry->flags.full_name_provided)
|
||||||
is defined, but it does not seem worth the headache to optimize
|
|
||||||
away those two bytes of space. */
|
|
||||||
string = (char *) xmalloc (strlen (search->name)
|
|
||||||
+ strlen (filename)
|
|
||||||
+ strlen (arch)
|
|
||||||
#ifdef EXTRA_SHLIB_EXTENSION
|
|
||||||
+ strlen (EXTRA_SHLIB_EXTENSION)
|
|
||||||
#endif
|
|
||||||
+ sizeof "/lib.so");
|
|
||||||
|
|
||||||
sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
|
|
||||||
|
|
||||||
#ifdef EXTRA_SHLIB_EXTENSION
|
|
||||||
/* Try the .so extension first. If that fails build a new filename
|
|
||||||
using EXTRA_SHLIB_EXTENSION. */
|
|
||||||
if (! ldfile_try_open_bfd (string, entry))
|
|
||||||
{
|
{
|
||||||
sprintf (string, "%s/lib%s%s%s", search->name,
|
len += sizeof "/";
|
||||||
filename, arch, EXTRA_SHLIB_EXTENSION);
|
string = (char *) xmalloc (len);
|
||||||
#endif
|
sprintf (string, "%s/%s", search->name, filename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t xlen = 0;
|
||||||
|
|
||||||
if (! ldfile_try_open_bfd (string, entry))
|
len += strlen (arch) + sizeof "/lib.so";
|
||||||
|
#ifdef EXTRA_SHLIB_EXTENSION
|
||||||
|
xlen = (strlen (EXTRA_SHLIB_EXTENSION) > 3
|
||||||
|
? strlen (EXTRA_SHLIB_EXTENSION) - 3
|
||||||
|
: 0);
|
||||||
|
#endif
|
||||||
|
string = (char *) xmalloc (len + xlen);
|
||||||
|
sprintf (string, "%s/lib%s%s.so", search->name, filename, arch);
|
||||||
|
#ifdef EXTRA_SHLIB_EXTENSION
|
||||||
|
/* Try the .so extension first. If that fails build a new filename
|
||||||
|
using EXTRA_SHLIB_EXTENSION. */
|
||||||
|
opened = ldfile_try_open_bfd (string, entry);
|
||||||
|
if (!opened)
|
||||||
|
strcpy (string + len - 4, EXTRA_SHLIB_EXTENSION);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opened && !ldfile_try_open_bfd (string, entry))
|
||||||
{
|
{
|
||||||
free (string);
|
free (string);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#ifdef EXTRA_SHLIB_EXTENSION
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
entry->filename = string;
|
entry->filename = string;
|
||||||
|
|
||||||
@ -1716,7 +1720,8 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
|||||||
/* Rather than duplicating the logic above. Just use the
|
/* Rather than duplicating the logic above. Just use the
|
||||||
filename we recorded earlier. */
|
filename we recorded earlier. */
|
||||||
|
|
||||||
filename = lbasename (entry->filename);
|
if (!entry->flags.full_name_provided)
|
||||||
|
filename = lbasename (entry->filename);
|
||||||
bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
|
bfd_elf_set_dt_needed_name (entry->the_bfd, filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ gld${EMULATION_NAME}_open_dynamic_archive
|
|||||||
{
|
{
|
||||||
char *string;
|
char *string;
|
||||||
|
|
||||||
if (! entry->flags.maybe_archive)
|
if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
string = (char *) xmalloc (strlen (search->name)
|
string = (char *) xmalloc (strlen (search->name)
|
||||||
|
@ -2108,7 +2108,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
|
||||||
if (! entry->flags.maybe_archive)
|
if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
filename = entry->filename;
|
filename = entry->filename;
|
||||||
|
@ -1879,7 +1879,7 @@ gld_${EMULATION_NAME}_open_dynamic_archive
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
|
||||||
if (! entry->flags.maybe_archive)
|
if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
filename = entry->filename;
|
filename = entry->filename;
|
||||||
|
@ -57,7 +57,7 @@ gld${EMULATION_NAME}_open_dynamic_archive (const char *arch ATTRIBUTE_UNUSED,
|
|||||||
{
|
{
|
||||||
char *string;
|
char *string;
|
||||||
|
|
||||||
if (! entry->flags.maybe_archive)
|
if (! entry->flags.maybe_archive || entry->flags.full_name_provided)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
string = (char *) xmalloc (strlen (search->name)
|
string = (char *) xmalloc (strlen (search->name)
|
||||||
|
@ -367,7 +367,7 @@ ldfile_open_file_search (const char *arch,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry->flags.maybe_archive)
|
if (entry->flags.maybe_archive && !entry->flags.full_name_provided)
|
||||||
string = concat (search->name, slash, lib, entry->filename,
|
string = concat (search->name, slash, lib, entry->filename,
|
||||||
arch, suffix, (const char *) NULL);
|
arch, suffix, (const char *) NULL);
|
||||||
else
|
else
|
||||||
|
15
ld/ldlang.c
15
ld/ldlang.c
@ -1063,13 +1063,6 @@ new_afile (const char *name,
|
|||||||
p->flags.whole_archive = input_flags.whole_archive;
|
p->flags.whole_archive = input_flags.whole_archive;
|
||||||
p->flags.sysrooted = input_flags.sysrooted;
|
p->flags.sysrooted = input_flags.sysrooted;
|
||||||
|
|
||||||
if (file_type == lang_input_file_is_l_enum
|
|
||||||
&& name[0] == ':' && name[1] != '\0')
|
|
||||||
{
|
|
||||||
file_type = lang_input_file_is_search_file_enum;
|
|
||||||
name = name + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (file_type)
|
switch (file_type)
|
||||||
{
|
{
|
||||||
case lang_input_file_is_symbols_only_enum:
|
case lang_input_file_is_symbols_only_enum:
|
||||||
@ -1083,7 +1076,13 @@ new_afile (const char *name,
|
|||||||
p->local_sym_name = name;
|
p->local_sym_name = name;
|
||||||
break;
|
break;
|
||||||
case lang_input_file_is_l_enum:
|
case lang_input_file_is_l_enum:
|
||||||
p->filename = name;
|
if (name[0] == ':' && name[1] != '\0')
|
||||||
|
{
|
||||||
|
p->filename = name + 1;
|
||||||
|
p->flags.full_name_provided = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
p->filename = name;
|
||||||
p->local_sym_name = concat ("-l", name, (const char *) NULL);
|
p->local_sym_name = concat ("-l", name, (const char *) NULL);
|
||||||
p->flags.maybe_archive = TRUE;
|
p->flags.maybe_archive = TRUE;
|
||||||
p->flags.real = TRUE;
|
p->flags.real = TRUE;
|
||||||
|
@ -235,6 +235,9 @@ struct lang_input_statement_flags
|
|||||||
/* 1 means this file was specified in a -l option. */
|
/* 1 means this file was specified in a -l option. */
|
||||||
unsigned int maybe_archive : 1;
|
unsigned int maybe_archive : 1;
|
||||||
|
|
||||||
|
/* 1 means this file was specified in a -l:namespec option. */
|
||||||
|
unsigned int full_name_provided : 1;
|
||||||
|
|
||||||
/* 1 means search a set of directories for this file. */
|
/* 1 means search a set of directories for this file. */
|
||||||
unsigned int search_dirs : 1;
|
unsigned int search_dirs : 1;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user