mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 02:24:46 +08:00
bfd/
* bfd-in2.h: Regenerate. * bfd.c (struct bfd): Add no_export. * elflink.c (elf_link_add_object_symbols): Handle no_export. ld/ * ldlang.c (struct excluded_lib, excluded_libs, add_excluded_libs) (check_excluded_libs): New. (load_symbols): Call check_excluded_libs. * ldlang.h (add_excluded_libs): New prototype. * emultempl/elf32.em (OPTION_EXCLUDED_LIBS): Define. (gld${EMULATION_NAME}_add_options): Add --exclude-libs. (gld${EMULATION_NAME}_handle_option): Handle --exclude-libs. * ld.texinfo (Command Line Variables): Document --exclude-libs. (Options Specific to i386 PE Targets): Remove --exclude-libs. ld/testsuite/ * ld-elf/exclude1.s, ld-elf/exclude2.s, ld-elf/exclude.exp: New.
This commit is contained in:
parent
fd5008162e
commit
b58f81aef6
@ -1,3 +1,9 @@
|
||||
2004-10-16 Daniel Jacobowitz <dan@debian.org>
|
||||
|
||||
* bfd-in2.h: Regenerate.
|
||||
* bfd.c (struct bfd): Add no_export.
|
||||
* elflink.c (elf_link_add_object_symbols): Handle no_export.
|
||||
|
||||
2004-10-15 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* config.bfd: Whitespace cleanup.
|
||||
|
@ -3962,6 +3962,9 @@ struct bfd
|
||||
/* Pointer to structure which contains architecture information. */
|
||||
const struct bfd_arch_info *arch_info;
|
||||
|
||||
/* Flag set if symbols from this BFD should not be exported. */
|
||||
bfd_boolean no_export;
|
||||
|
||||
/* Stuff only useful for archives. */
|
||||
void *arelt_data;
|
||||
struct bfd *my_archive; /* The containing archive BFD. */
|
||||
|
@ -133,6 +133,9 @@ CODE_FRAGMENT
|
||||
. {* Pointer to structure which contains architecture information. *}
|
||||
. const struct bfd_arch_info *arch_info;
|
||||
.
|
||||
. {* Flag set if symbols from this BFD should not be exported. *}
|
||||
. bfd_boolean no_export;
|
||||
.
|
||||
. {* Stuff only useful for archives. *}
|
||||
. void *arelt_data;
|
||||
. struct bfd *my_archive; {* The containing archive BFD. *}
|
||||
|
@ -3778,6 +3778,14 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
||||
(*bed->elf_backend_merge_symbol_attribute) (h, isym, definition,
|
||||
dynamic);
|
||||
|
||||
/* If this symbol has default visibility and the user has requested
|
||||
we not re-export it, then mark it as hidden. */
|
||||
if (definition && !dynamic
|
||||
&& (abfd->no_export
|
||||
|| (abfd->my_archive && abfd->my_archive->no_export))
|
||||
&& ELF_ST_VISIBILITY (isym->st_other) != STV_INTERNAL)
|
||||
isym->st_other = STV_HIDDEN | (isym->st_other & ~ ELF_ST_VISIBILITY (-1));
|
||||
|
||||
if (isym->st_other != 0 && !dynamic)
|
||||
{
|
||||
unsigned char hvis, symvis, other, nvis;
|
||||
|
12
ld/ChangeLog
12
ld/ChangeLog
@ -1,3 +1,15 @@
|
||||
2004-10-16 Daniel Jacobowitz <dan@debian.org>
|
||||
|
||||
* ldlang.c (struct excluded_lib, excluded_libs, add_excluded_libs)
|
||||
(check_excluded_libs): New.
|
||||
(load_symbols): Call check_excluded_libs.
|
||||
* ldlang.h (add_excluded_libs): New prototype.
|
||||
* emultempl/elf32.em (OPTION_EXCLUDED_LIBS): Define.
|
||||
(gld${EMULATION_NAME}_add_options): Add --exclude-libs.
|
||||
(gld${EMULATION_NAME}_handle_option): Handle --exclude-libs.
|
||||
* ld.texinfo (Command Line Variables): Document --exclude-libs.
|
||||
(Options Specific to i386 PE Targets): Remove --exclude-libs.
|
||||
|
||||
2004-10-15 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ldexp.c (exp_fold_tree): Don't immediately exit ld on a
|
||||
|
@ -1571,7 +1571,8 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
|
||||
#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
|
||||
#define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
|
||||
|
||||
#define OPTION_EXCLUDE_LIBS (OPTION_EH_FRAME_HDR + 1)
|
||||
|
||||
static void
|
||||
gld${EMULATION_NAME}_add_options
|
||||
(int ns, char **shortopts, int nl, struct option **longopts,
|
||||
@ -1586,6 +1587,7 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
{"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
|
||||
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
|
||||
{"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
|
||||
{"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
|
||||
{"Bgroup", no_argument, NULL, OPTION_GROUP},
|
||||
EOF
|
||||
fi
|
||||
@ -1638,6 +1640,10 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||
link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
|
||||
break;
|
||||
|
||||
case OPTION_EXCLUDE_LIBS:
|
||||
add_excluded_libs (optarg);
|
||||
break;
|
||||
|
||||
case 'z':
|
||||
if (strcmp (optarg, "initfirst") == 0)
|
||||
link_info.flags_1 |= (bfd_vma) DF_1_INITFIRST;
|
||||
|
@ -449,6 +449,17 @@ base 10; you may use a leading @samp{0x} for base 16, or a leading
|
||||
@samp{0} for base 8). @xref{Entry Point}, for a discussion of defaults
|
||||
and other ways of specifying the entry point.
|
||||
|
||||
@kindex --exclude-libs
|
||||
@item --exclude-libs @var{lib},@var{lib},...
|
||||
Specifies a list of archive libraries from which symbols should not be automatically
|
||||
exported. The library names may be delimited by commas or colons. Specifying
|
||||
@code{--exclude-libs ALL} excludes symbols in all archive libraries from
|
||||
automatic export. This option is available only for the i386 PE targeted
|
||||
port of the linker and for ELF targeted ports. For i386 PE, symbols
|
||||
explicitly listed in a .def file are still exported, regardless of this
|
||||
option. For ELF targeted ports, symbols affected by this option will
|
||||
be treated as hidden.
|
||||
|
||||
@cindex dynamic symbol table
|
||||
@kindex -E
|
||||
@kindex --export-dynamic
|
||||
@ -1884,15 +1895,6 @@ Specifies a list of symbols which should not be automatically
|
||||
exported. The symbol names may be delimited by commas or colons.
|
||||
[This option is specific to the i386 PE targeted port of the linker]
|
||||
|
||||
@kindex --exclude-libs
|
||||
@item --exclude-libs @var{lib},@var{lib},...
|
||||
Specifies a list of archive libraries from which symbols should not be automatically
|
||||
exported. The library names may be delimited by commas or colons. Specifying
|
||||
@code{--exclude-libs ALL} excludes symbols in all archive libraries from
|
||||
automatic export. Symbols explicitly listed in a .def file are still exported,
|
||||
regardless of this option.
|
||||
[This option is specific to the i386 PE targeted port of the linker]
|
||||
|
||||
@kindex --file-alignment
|
||||
@item --file-alignment
|
||||
Specify the file alignment. Sections in the file will always begin at
|
||||
|
63
ld/ldlang.c
63
ld/ldlang.c
@ -1692,6 +1692,67 @@ lookup_name (const char *name)
|
||||
return search;
|
||||
}
|
||||
|
||||
/* Save LIST as a list of libraries whose symbols should not be exported. */
|
||||
|
||||
struct excluded_lib
|
||||
{
|
||||
char *name;
|
||||
struct excluded_lib *next;
|
||||
};
|
||||
static struct excluded_lib *excluded_libs;
|
||||
|
||||
void
|
||||
add_excluded_libs (const char *list)
|
||||
{
|
||||
const char *p = list, *end;
|
||||
|
||||
while (*p != '\0')
|
||||
{
|
||||
struct excluded_lib *entry;
|
||||
end = strpbrk (p, ",:");
|
||||
if (end == NULL)
|
||||
end = p + strlen (p);
|
||||
entry = xmalloc (sizeof (*entry));
|
||||
entry->next = excluded_libs;
|
||||
entry->name = xmalloc (end - p + 1);
|
||||
memcpy (entry->name, p, end - p);
|
||||
entry->name[end - p] = '\0';
|
||||
excluded_libs = entry;
|
||||
if (*end == '\0')
|
||||
break;
|
||||
p = end + 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
check_excluded_libs (bfd *abfd)
|
||||
{
|
||||
struct excluded_lib *lib = excluded_libs;
|
||||
|
||||
while (lib)
|
||||
{
|
||||
int len = strlen (lib->name);
|
||||
const char *filename = lbasename (abfd->filename);
|
||||
|
||||
if (strcmp (lib->name, "ALL") == 0)
|
||||
{
|
||||
abfd->no_export = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncmp (lib->name, filename, len) == 0
|
||||
&& (filename[len] == '\0'
|
||||
|| (filename[len] == '.' && filename[len + 1] == 'a'
|
||||
&& filename[len + 2] == '\0')))
|
||||
{
|
||||
abfd->no_export = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
lib = lib->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the symbols for an input file. */
|
||||
|
||||
static bfd_boolean
|
||||
@ -1776,6 +1837,8 @@ load_symbols (lang_input_statement_type *entry,
|
||||
break;
|
||||
|
||||
case bfd_archive:
|
||||
check_excluded_libs (entry->the_bfd);
|
||||
|
||||
if (entry->whole_archive)
|
||||
{
|
||||
bfd *member = NULL;
|
||||
|
@ -589,4 +589,6 @@ extern int lang_symbol_definition_iteration (const char *);
|
||||
extern void lang_update_definedness
|
||||
(const char *, struct bfd_link_hash_entry *);
|
||||
|
||||
extern void add_excluded_libs (const char *);
|
||||
|
||||
#endif
|
||||
|
@ -1,3 +1,7 @@
|
||||
2004-10-16 Daniel Jacobowitz <dan@debian.org>
|
||||
|
||||
* ld-elf/exclude1.s, ld-elf/exclude2.s, ld-elf/exclude.exp: New.
|
||||
|
||||
2004-10-15 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* ld-crx/reloc-num8.d: Adjust for changed orphan placement.
|
||||
|
137
ld/testsuite/ld-elf/exclude.exp
Normal file
137
ld/testsuite/ld-elf/exclude.exp
Normal file
@ -0,0 +1,137 @@
|
||||
# Expect script for --exclude-libs tests
|
||||
# Copyright 2004 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# 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.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
# Make sure that ld can hide symbols from libraries when building a shared
|
||||
# library.
|
||||
|
||||
# This test can only be run on ELF platforms.
|
||||
if ![is_elf_format] {
|
||||
return
|
||||
}
|
||||
|
||||
# No shared lib support on this target.
|
||||
if { [istarget "mcore-*-*"] } {
|
||||
return
|
||||
}
|
||||
|
||||
global ar
|
||||
global as
|
||||
global ld
|
||||
global nm
|
||||
global nm_output
|
||||
|
||||
set test1 "ld link shared library"
|
||||
set test2 "ld export symbols from archive"
|
||||
set test3 "ld link shared library with --exclude-libs"
|
||||
set test4 "ld exclude symbols from archive - --exclude-libs libexclude"
|
||||
set test5 "ld exclude symbols from archive - --exclude-libs libexclude.a"
|
||||
set test6 "ld exclude symbols from archive - --exclude-libs ALL"
|
||||
set test7 "ld exclude symbols from archive - --exclude-libs foo:libexclude.a"
|
||||
set test8 "ld exclude symbols from archive - --exclude-libs foo,libexclude.a"
|
||||
set test9 "ld don't exclude symbols from archive - --exclude-libs foo:bar"
|
||||
|
||||
if { ![ld_assemble $as $srcdir/$subdir/exclude1.s tmpdir/exclude1.o ]
|
||||
|| ![ld_assemble $as $srcdir/$subdir/exclude2.s tmpdir/exclude2.o] } {
|
||||
unresolved $test1
|
||||
return
|
||||
}
|
||||
|
||||
catch "exec rm -f tmpdir/libexclude.a" catch_output
|
||||
catch "exec $ar cq tmpdir/libexclude.a tmpdir/exclude2.o" catch_output
|
||||
if {![string match "" $catch_output]} {
|
||||
unresolved $test1
|
||||
return
|
||||
}
|
||||
|
||||
# Test that the symbol is normally exported.
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } {
|
||||
pass $test1
|
||||
} else {
|
||||
if [string match "*shared not supported*" $link_output] {
|
||||
unsupported "$test1 - -shared is not supported by this target"
|
||||
} else {
|
||||
fail $test1
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if ![ld_nm $nm "-D" tmpdir/exclude.so] {
|
||||
unresolved $test2
|
||||
} elseif { [info exists nm_output(exclude_sym)] } {
|
||||
pass $test2
|
||||
} else {
|
||||
fail $test2
|
||||
}
|
||||
|
||||
# Test --exclude-libs libexclude
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude --shared tmpdir/exclude1.o -Ltmpdir -lexclude"] } {
|
||||
pass $test3
|
||||
} else {
|
||||
fail $test3
|
||||
}
|
||||
|
||||
if ![ld_nm $nm "-D" tmpdir/exclude.so] {
|
||||
unresolved $test4
|
||||
} elseif { ! [info exists nm_output(exclude_sym)] } {
|
||||
pass $test4
|
||||
} else {
|
||||
fail $test4
|
||||
}
|
||||
|
||||
# Test alternate spellings of --exclude-libs
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
|
||||
&& [ld_nm $nm "-D" tmpdir/exclude.so]
|
||||
&& ! [info exists nm_output(exclude_sym)] } {
|
||||
pass $test5
|
||||
} else {
|
||||
fail $test5
|
||||
}
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs ALL --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
|
||||
&& [ld_nm $nm "-D" tmpdir/exclude.so]
|
||||
&& ! [info exists nm_output(exclude_sym)] } {
|
||||
pass $test6
|
||||
} else {
|
||||
fail $test6
|
||||
}
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
|
||||
&& [ld_nm $nm "-D" tmpdir/exclude.so]
|
||||
&& ! [info exists nm_output(exclude_sym)] } {
|
||||
pass $test7
|
||||
} else {
|
||||
fail $test7
|
||||
}
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo,libexclude.a --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
|
||||
&& [ld_nm $nm "-D" tmpdir/exclude.so]
|
||||
&& ! [info exists nm_output(exclude_sym)] } {
|
||||
pass $test8
|
||||
} else {
|
||||
fail $test8
|
||||
}
|
||||
|
||||
if { [ld_simple_link $ld tmpdir/exclude.so "--exclude-libs foo:bar --shared tmpdir/exclude1.o -Ltmpdir -lexclude"]
|
||||
&& [ld_nm $nm "-D" tmpdir/exclude.so]
|
||||
&& [info exists nm_output(exclude_sym)] } {
|
||||
pass $test9
|
||||
} else {
|
||||
fail $test9
|
||||
}
|
3
ld/testsuite/ld-elf/exclude1.s
Normal file
3
ld/testsuite/ld-elf/exclude1.s
Normal file
@ -0,0 +1,3 @@
|
||||
.globl include_sym
|
||||
include_sym:
|
||||
.long exclude_sym - include_sym
|
3
ld/testsuite/ld-elf/exclude2.s
Normal file
3
ld/testsuite/ld-elf/exclude2.s
Normal file
@ -0,0 +1,3 @@
|
||||
.globl exclude_sym
|
||||
exclude_sym:
|
||||
.long 0
|
Loading…
Reference in New Issue
Block a user