Broken PIC support in OS X

Manuel M T Chakravarty chak at cse.unsw.edu.au
Fri Aug 5 07:05:18 CEST 2011


GMP version 5.0.2
OS/arch: OS X 10.7 (Lion), x86_64
Compiler: gcc 4.2 (Xcode 4.1)

Problem
~~~~~~~
When compiling GMP 5.0.2 on the specified system, assembly code (such as 'mpn/x86_64/bdiv_q_1.asm') is incorrectly compiled without support for PIC.  According to Apple documentation, the x86_64 code model for Mach-O always requires PIC:

  http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/x86_64_code.html

As a result PIC is the default and doesn't need to be specified when compiling or linking.  Assembly code that doesn't adhere to this convention leads to a link time warning of the form

  ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE

The linker will still produce a binary, but it is not position independent.

Testing
~~~~~~~
To test, simply pre-process an assembly file, e.g.,

  m4  -DHAVE_CONFIG_H -D__GMP_WITHIN_GMP -DOPERATION_bdiv_q_1 bdiv_q_1.asm >tmp-bdiv_q_1.s

The resulting assembly code will load a global table address with

  movabs  $binvert_limb_table, %rdx

instead of with

  mov     binvert_limb_table at GOTPCREL(%rip), %rdx

Solution
~~~~~~~~
I append a patch that fixes the problem.

Manuel

PS: I tested this on OS X 10.7, but believe the same issues arises on 10.6 for x86_64 and recent versions of Xcode.


-=- Patch to ensure PIC support is used on OS X/x64_64 -=-

--- gmp-5.0.2.orig/configure.in	2011-08-04 16:35:01.000000000 +1000
+++ gmp-5.0.2/configure.in	2011-08-04 16:39:03.000000000 +1000
@@ -3178,6 +3178,7 @@
           AC_DEFINE(HAVE_HOST_CPU_FAMILY_x86_64)
 	  case $host in
 	    *-*-darwin*)
+	      GMP_DEFINE_RAW(["define(<PIC_ALWAYS>,<yes>)"])
 	      GMP_INCLUDE_MPN(x86_64/darwin.m4) ;;
 	  esac
           ;;
--- gmp-5.0.2.orig/mpn/asm-defs.m4	2011-08-04 23:11:19.000000000 +1000
+++ gmp-5.0.2/mpn/asm-defs.m4	2011-08-04 23:11:59.000000000 +1000
@@ -1041,7 +1041,7 @@
 dnl  systems which are always PIC.  PIC_ALWAYS established in config.m4
 dnl  identifies these for us.
 
-ifelse(`PIC_ALWAYS',`yes',`define(`PIC')')
+ifelse(PIC_ALWAYS,yes,`define(`PIC')')
 
 
 dnl  Various possible defines passed from the Makefile that are to be tested



More information about the gmp-bugs mailing list