* options.cc (General_options::parse_exclude_libs). Fix a comment.
(General_options::check_excluded_libs): Strip off directories in
archive name before matching like GNU ld does.
* testsuite/Makefile.am (MOSTLYCLEANFILES,
exclude_libs_test_DEPENDENCIES): Add alt/libexclude_libs_test_3.a
(exclude_libs_test_LDFLAGS): Add linker option
-Wl,--exclude-libs,libexclude_libs_test_3
(exclude_libs_test_LADD): Add alt/libexclude_libs_test_3.a as
an explicit archive without using -l.
(alt/libexclude_libs_test_3.a): New make rule.
* testsuite/Makefile.in: Regenerate.
* testsuite/exclude_libs_test.c : Declare lib3_default().
(main): Call it.
* exclude_libs_test.sh: Add tests for alt/exclude_libs_test_3.a.
* exclude_libs_test_3.c: New file.
}
// The function add_excluded_libs() in ld/ldlang.c of GNU ld breaks up a list
-// of names seperated by commas or semi-colons and puts them in a linked list.
+// of names seperated by commas or colons and puts them in a linked list.
// We implement the same parsing of names here but store names in an unordered
// map to speed up searching of names.
if (p != excluded_libs_.end())
return true;
+ // First strip off any directories in name.
+ const char *basename = lbasename(name.c_str());
+
// Try finding an exact match.
- p = excluded_libs_.find(name);
+ p = excluded_libs_.find(std::string(basename));
if (p != excluded_libs_.end())
return true;
// Try matching NAME without ".a" at the end.
- size_t length = name.length();
+ size_t length = strlen(basename);
if ((length >= 2)
- && (name[length-2] == '.')
- && (name[length-1] == 'a'))
+ && (basename[length - 2] == '.')
+ && (basename[length - 1] == 'a'))
{
- p = excluded_libs_.find(name.substr(0, length - 2));
+ p = excluded_libs_.find(std::string(basename, length - 2));
if (p != excluded_libs_.end())
return true;
}
check_SCRIPTS += exclude_libs_test.sh
check_DATA += exclude_libs_test.syms
MOSTLYCLEANFILES += exclude_libs_test.syms libexclude_libs_test_1.a \
- libexclude_libs_test_2.a
+ libexclude_libs_test_2.a alt/libexclude_libs_test_3.a
exclude_libs_test_SOURCES = exclude_libs_test.c
exclude_libs_test_DEPENDENCIES = gcctestdir/ld libexclude_libs_test_1.a \
- libexclude_libs_test_2.a
-exclude_libs_test_LDFLAGS = -Bgcctestdir/ -L. \
- -Wl,--exclude-libs,dummy:libexclude_libs_test_1
-exclude_libs_test_LDADD = -lexclude_libs_test_1 -lexclude_libs_test_2
+ libexclude_libs_test_2.a alt/libexclude_libs_test_3.a
+exclude_libs_test_LDFLAGS = -Bgcctestdir/ -L. -Lalt \
+ -Wl,--exclude-libs,dummy:libexclude_libs_test_1 \
+ -Wl,--exclude-libs,libexclude_libs_test_3
+exclude_libs_test_LDADD = -lexclude_libs_test_1 -lexclude_libs_test_2 \
+ alt/libexclude_libs_test_3.a
exclude_libs_test.syms: exclude_libs_test
$(TEST_READELF) -sW $< >$@ 2>/dev/null
libexclude_libs_test_1.a: exclude_libs_test_1.o
$(TEST_AR) rc $@ $^
libexclude_libs_test_2.a: exclude_libs_test_2.o
$(TEST_AR) rc $@ $^
+alt/libexclude_libs_test_3.a: exclude_libs_test_3.o
+ test -d alt || mkdir -p alt
+ $(TEST_AR) rc $@ $^
endif GCC
endif NATIVE_LINKER
@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_25 = exclude_libs_test.sh
@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_26 = exclude_libs_test.syms
@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_27 = exclude_libs_test.syms libexclude_libs_test_1.a \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ libexclude_libs_test_2.a
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ libexclude_libs_test_2.a alt/libexclude_libs_test_3.a
-@GCC_FALSE@exclude_libs_test_DEPENDENCIES =
-@NATIVE_LINKER_FALSE@exclude_libs_test_DEPENDENCIES =
subdir = testsuite
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@GCC_TRUE@@NATIVE_LINKER_TRUE@thin_archive_test_2_LDADD = -lthinall
@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_SOURCES = exclude_libs_test.c
@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_DEPENDENCIES = gcctestdir/ld libexclude_libs_test_1.a \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ libexclude_libs_test_2.a
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ libexclude_libs_test_2.a alt/libexclude_libs_test_3.a
-@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_LDFLAGS = -Bgcctestdir/ -L. \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--exclude-libs,dummy:libexclude_libs_test_1
+@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_LDFLAGS = -Bgcctestdir/ -L. -Lalt \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--exclude-libs,dummy:libexclude_libs_test_1 \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ -Wl,--exclude-libs,libexclude_libs_test_3
+
+@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_LDADD = -lexclude_libs_test_1 -lexclude_libs_test_2 \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ alt/libexclude_libs_test_3.a
-@GCC_TRUE@@NATIVE_LINKER_TRUE@exclude_libs_test_LDADD = -lexclude_libs_test_1 -lexclude_libs_test_2
all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-am
exit 1;; \
esac; \
done; \
- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testsuite/Makefile'; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu testsuite/Makefile'; \
cd $(top_srcdir) && \
- $(AUTOMAKE) --foreign testsuite/Makefile
+ $(AUTOMAKE) --gnu testsuite/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc $@ $^
@GCC_TRUE@@NATIVE_LINKER_TRUE@libexclude_libs_test_2.a: exclude_libs_test_2.o
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc $@ $^
+@GCC_TRUE@@NATIVE_LINKER_TRUE@alt/libexclude_libs_test_3.a: exclude_libs_test_3.o
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ test -d alt || mkdir -p alt
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_AR) rc $@ $^
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
extern void lib1_default (void);
extern void lib2_default (void);
+extern void lib3_default (void);
int
main (int argc __attribute__ ((unused)),
{
lib1_default ();
lib2_default ();
+ lib3_default ();
return 0;
}
check "exclude_libs_test.syms" "lib2_protected" "PROTECTED"
check "exclude_libs_test.syms" "lib2_internal" "INTERNAL"
check "exclude_libs_test.syms" "lib2_hidden" "HIDDEN"
+check "exclude_libs_test.syms" "lib3_default" "HIDDEN"
+check "exclude_libs_test.syms" "lib3_protected" "HIDDEN"
+check "exclude_libs_test.syms" "lib3_internal" "INTERNAL"
+check "exclude_libs_test.syms" "lib3_hidden" "HIDDEN"
exit 0
--- /dev/null
+void lib3_default (void);
+void lib3_hidden (void);
+void lib3_internal (void);
+void lib3_protected (void);
+
+void __attribute__((visibility ("default")))
+lib3_default (void)
+{
+}
+
+void __attribute__((visibility ("hidden")))
+lib3_hidden (void)
+{
+}
+
+void __attribute__((visibility ("internal")))
+lib3_internal (void)
+{
+}
+
+void __attribute__((visibility ("protected")))
+lib3_protected (void)
+{
+}