Optimizing accesses to Globals with -fpie -pie:
authorSriraman Tallam <tmsriram@google.com>
Tue, 13 May 2014 17:33:59 +0000 (10:33 -0700)
committerSriraman Tallam <tmsriram@google.com>
Tue, 13 May 2014 17:33:59 +0000 (10:33 -0700)
With -pie and x86, the linker complains if it sees a PC-relative relocation
to access a global as it expects a GOTPCREL relocation.  This is really not
necessary as the linker could use a copy relocation to get around it.  This
patch enables copy relocations with pie.

Context:
This is useful because currently the GCC compiler with option -fpie makes
every extern global access go through the GOT. That is because the compiler
cannot tell if a global will end up being defined in the executable or not
and is conservative. This ends up hurting performance when the binary is linked
as mostly static where most of the globals do end up being defined in the
executable.  By allowing copy relocs with fPIE, the compiler need not generate
a GOTPCREL(GOT access) for any global access.  It can safely assume that all
globals will be defined in the executable and generate a PC-relative access
instead.  Gold can then create a copy reloc for only the undefined globals.

gold/testsuite/pie_copyrelocs_shared_test.cc [new file with mode: 0644]
gold/testsuite/pie_copyrelocs_test.cc [new file with mode: 0644]

diff --git a/gold/testsuite/pie_copyrelocs_shared_test.cc b/gold/testsuite/pie_copyrelocs_shared_test.cc
new file mode 100644 (file)
index 0000000..8513417
--- /dev/null
@@ -0,0 +1,26 @@
+// pie_copyrelocs_shared_test.cc -- a test case for gold, used
+// by pie_copyrelocs_test
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+// Written by Sriraman Tallam <tmsriram@google.com>.
+
+// This file is part of gold.
+
+// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+
+
+int glob_a = 128;
diff --git a/gold/testsuite/pie_copyrelocs_test.cc b/gold/testsuite/pie_copyrelocs_test.cc
new file mode 100644 (file)
index 0000000..bebe89d
--- /dev/null
@@ -0,0 +1,31 @@
+// pie_coprelocs_test.cc -- a test case for gold
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+// Written by Sriraman Tallam <tmsriram@google.com>.
+
+// This file is part of gold.
+
+// This program 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
+// MA 02110-1301, USA.
+
+// Check if copy relocs are used to access globals below when -fpie is
+// is not used to compile but -pie is used to link.
+
+extern int glob_a;
+
+int main ()
+{
+  return glob_a - 128;
+}