public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Sriraman Tallam <tmsriram@google.com>
To: binutils <binutils@sourceware.org>,
	Cary Coutant <ccoutant@google.com>,
		Paul Pluzhnikov <ppluzhnikov@google.com>,
	Rong Xu <xur@google.com>, 	Brooks Moses <bmoses@google.com>,
	Ollie Wild <aaw@google.com>, David Li <davidxl@google.com>,
		Teresa Johnson <tejohnson@google.com>,
	"H.J. Lu" <hjl.tools@gmail.com>,
		Ian Lance Taylor <iant@google.com>
Subject: Patch to not create GOT and dynamic relocation entries for unresolved symbols with --warn-unresolved-symbols.
Date: Sat, 11 Apr 2015 00:16:00 -0000	[thread overview]
Message-ID: <CAAs8Hmxe3fNV-7MLyNhk_=DOaR91-s=dFw3E-cFdqCCiGxxreA@mail.gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1034 bytes --]

Hi,

    We have a problem where we use --warn-unresolved-symbols to tide
over an issue where we know the symbol is undefined but we also know
that the it is never accessed.

Example:

extern int foo();

int (*p)() = NULL;
int main() {
  if (p == &foo)
    foo();
  return 0;
}

Now,

$ g++ -O2 foo.cc
foo.cc:function main: warning: undefined reference to 'foo()'

gives the right warning but builds a.out just fine and runs fine as
long as p is not equal to foo which is our case.

However, with -fPIE

$ g++ -O2 -fPIE foo.cc -pie
foo.cc:function main: warning: undefined reference to 'foo()'

but
$./a.out
./a.out: symbol lookup error: ./a.out: undefined symbol: _Z3foov

because with fPIE, a function pointer access is using a GOTPCREL
relocation which creates a GOT entry and a dynamic relocation for it.
The dynamic linker does not like the unresolved symbol any more.

I have attached a patch to prevent creation of GOT and dynamic
relocation entries with --warn-unresolved-symbols in general.  Is this
reasonable?


Thanks
Sri

[-- Attachment #2: warn_unresolved.txt --]
[-- Type: text/plain, Size: 1450 bytes --]

	* x86_64.cc (Scan::global): Do not create GOT entry for 
	unresolved symbol with --warn-unresolved-symbols.
	(Relocate::relocate): Check for GOT entry only when the
	above condition is not true.

diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 007af1d..bccb0ab 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -2931,6 +2931,11 @@ Target_x86_64<size>::Scan::global(Symbol_table* symtab,
 	  }
 	else
 	  {
+	    // If the symbol is unresolved and we use --warn-unresolved-symbols
+	    // do not create GOT entry and dynamic relocation for it.
+	    if (parameters->options().warn_unresolved_symbols()
+		&& issue_undefined_symbol_error(gsym))
+	      break;
 	    // If this symbol is not fully resolved, we need to add a
 	    // dynamic relocation for it.
 	    Reloc_section* rela_dyn = target->rela_dyn_section(layout);
@@ -3557,8 +3562,14 @@ Target_x86_64<size>::Relocate::relocate(
 	{
 	  if (gsym != NULL)
 	    {
-	      gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
-	      got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size();
+	      // We dont create GOT entries for unresolved symbols
+	      // with --warn-unresolved-symbols.
+	      if (!parameters->options().warn_unresolved_symbols()
+		  || !issue_undefined_symbol_error(gsym))
+		{
+		  gold_assert(gsym->has_got_offset(GOT_TYPE_STANDARD));
+		  got_offset = gsym->got_offset(GOT_TYPE_STANDARD) - target->got_size();
+		}
 	    }
 	  else
 	    {

             reply	other threads:[~2015-04-11  0:16 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-11  0:16 Sriraman Tallam [this message]
2015-04-11  0:22 ` Sriraman Tallam
2015-04-11  2:18 ` Cary Coutant
2015-04-11 13:28   ` H.J. Lu
2015-04-20 23:06     ` Sriraman Tallam
2015-04-22 19:33       ` Cary Coutant
2015-04-23 15:09         ` Cary Coutant
2015-04-23 17:27           ` Sriraman Tallam
2015-04-23 18:01             ` Cary Coutant

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAAs8Hmxe3fNV-7MLyNhk_=DOaR91-s=dFw3E-cFdqCCiGxxreA@mail.gmail.com' \
    --to=tmsriram@google.com \
    --cc=aaw@google.com \
    --cc=binutils@sourceware.org \
    --cc=bmoses@google.com \
    --cc=ccoutant@google.com \
    --cc=davidxl@google.com \
    --cc=hjl.tools@gmail.com \
    --cc=iant@google.com \
    --cc=ppluzhnikov@google.com \
    --cc=tejohnson@google.com \
    --cc=xur@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).