Skip to content

Commit

Permalink
Test for weak undefined symbols in linknamespace.pl.
Browse files Browse the repository at this point in the history
This patch makes linknamespace.pl require weak undefined symbols to be
within the standard namespace.  (It remains the case that
linknamespace.pl does not look for definitions of such symbols or
require symbols used in those definitions to be within the standard
namespace.)

Tested for x86_64 and x86.

	* conform/linknamespace.pl: Require weak undefined symbols to be
	in the standard namespace.
	(%strong_syms): Rename to %seen_syms.
	(%strong_seen): Rename to %seen_where.
  • Loading branch information
Joseph Myers committed Sep 18, 2015
1 parent e5d19c0 commit a435cc4
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 24 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2015-09-17 Joseph Myers <joseph@codesourcery.com>

* conform/linknamespace.pl: Require weak undefined symbols to be
in the standard namespace.
(%strong_syms): Rename to %seen_syms.
(%strong_seen): Rename to %seen_where.

2015-09-17 H.J. Lu <hongjiu.lu@intel.com>

[BZ #18970]
Expand Down
43 changes: 19 additions & 24 deletions conform/linknamespace.pl
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ sub list_syms {

# Load information about GLOBAL and WEAK symbols defined or used in
# the standard libraries.
# Strong symbols (defined or undefined) from a given object.
%strong_syms = ();
# Symbols from a given object, except for weak defined symbols.
%seen_syms = ();
# Strong undefined symbols from a given object.
%strong_undef_syms = ();
# Objects defining a given symbol (strongly or weakly).
Expand All @@ -112,17 +112,17 @@ sub list_syms {
}
push (@{$sym_objs{$name}}, $file);
}
if ($bind eq "GLOBAL") {
if (!defined ($strong_syms{$file})) {
$strong_syms{$file} = [];
if ($bind eq "GLOBAL" || !$defined) {
if (!defined ($seen_syms{$file})) {
$seen_syms{$file} = [];
}
push (@{$strong_syms{$file}}, $name);
if (!$defined) {
if (!defined ($strong_undef_syms{$file})) {
$strong_undef_syms{$file} = [];
}
push (@{$strong_undef_syms{$file}}, $name);
push (@{$seen_syms{$file}}, $name);
}
if ($bind eq "GLOBAL" && !$defined) {
if (!defined ($strong_undef_syms{$file})) {
$strong_undef_syms{$file} = [];
}
push (@{$strong_undef_syms{$file}}, $name);
}
}

Expand All @@ -132,12 +132,7 @@ sub list_syms {
# The rules followed are heuristic and so may produce false positives
# and false negatives.
#
# * Weak undefined symbols are ignored; however, if a code path that
# references one (even just to check if its address is 0) is executed,
# that may conflict with a definition of that symbol in the user's
# program.
#
# * Strong undefined symbols are considered of signficance, but it is
# * All undefined symbols are considered of signficance, but it is
# possible that (a) any standard library definition is weak, so can be
# overridden by the user's definition, and (b) the symbol is only used
# conditionally and not if the program is limited to standard
Expand Down Expand Up @@ -192,14 +187,14 @@ sub list_syms {
unlink ($cincfile_o) || die ("unlink $cincfile_o: $!\n");
unlink ($cincfile_sym) || die ("unlink $cincfile_sym: $!\n");

%strong_seen = ();
%seen_where = ();
%files_seen = ();
%all_undef = ();
%current_undef = ();
foreach my $sym (@elf_syms) {
my ($file, $name, $bind, $defined) = @$sym;
if ($bind eq "GLOBAL" && !$defined) {
$strong_seen{$name} = "[initial] $name";
$seen_where{$name} = "[initial] $name";
$all_undef{$name} = "[initial] $name";
$current_undef{$name} = "[initial] $name";
}
Expand All @@ -213,9 +208,9 @@ sub list_syms {
next;
}
$files_seen{$file} = 1;
foreach my $ssym (@{$strong_syms{$file}}) {
if (!defined ($strong_seen{$ssym})) {
$strong_seen{$ssym} = "$current_undef{$sym} -> [$file] $ssym";
foreach my $ssym (@{$seen_syms{$file}}) {
if (!defined ($seen_where{$ssym})) {
$seen_where{$ssym} = "$current_undef{$sym} -> [$file] $ssym";
}
}
foreach my $usym (@{$strong_undef_syms{$file}}) {
Expand All @@ -230,14 +225,14 @@ sub list_syms {
}

$ret = 0;
foreach my $sym (sort keys %strong_seen) {
foreach my $sym (sort keys %seen_where) {
if ($sym =~ /^_/) {
next;
}
if (defined ($stdsyms{$sym})) {
next;
}
print "$strong_seen{$sym}\n";
print "$seen_where{$sym}\n";
$ret = 1;
}

Expand Down

0 comments on commit a435cc4

Please sign in to comment.