libffcall
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Build a Secure-PLT version of the PowerPC PIC code


From: Josh Elsasser
Subject: Build a Secure-PLT version of the PowerPC PIC code
Date: Wed, 20 Nov 2019 20:16:42 -0800
User-agent: Mutt/1.5.22 (2013-10-16)

OpenBSD now requires PowerPC PIC code to be built for the newer
Secure-PLT ABI, rather than the original BSS-PLT ABI. I believe this
change was made to allow ld.so to resolve procedure relocations using
non-executable memory, rather than using self-modifying code stubs.
    
This adds gcc 4.1.2 to the cross compiler list, and uses it to build
the powerpc vacall_r pic code with -msecure-plt

diff --git .gitignore .gitignore
index 447b983..ed25615 100644
--- .gitignore
+++ .gitignore
@@ -211,6 +211,7 @@
 /callback/vacall_r/vacall-powerpc-linux.s
 /callback/vacall_r/vacall-powerpc-linux-macro.S
 /callback/vacall_r/vacall-powerpc-macos.s
+/callback/vacall_r/vacall-powerpc-secplt-macro.S
 /callback/vacall_r/vacall-powerpc-sysv4-macro.S
 /callback/vacall_r/vacall-powerpc64-aix.s
 /callback/vacall_r/vacall-powerpc64-linux.S
diff --git callback/vacall_r/Makefile.devel callback/vacall_r/Makefile.devel
index d596091..3899b52 100644
--- callback/vacall_r/Makefile.devel
+++ callback/vacall_r/Makefile.devel
@@ -21,7 +21,7 @@ precompiled : \
   vacall-hppa-macro.S vacall-hppa64-macro.S \
   vacall-arm-macro.S vacall-armhf-macro.S \
   vacall-arm64-macro.S \
-  vacall-powerpc-aix.s vacall-powerpc-linux-macro.S 
vacall-powerpc-sysv4-macro.S vacall-powerpc-macos.s vacall-powerpc64-aix.s 
vacall-powerpc64-linux.S vacall-powerpc64-elfv2-linux.S \
+  vacall-powerpc-aix.s vacall-powerpc-linux-macro.S 
vacall-powerpc-sysv4-macro.S vacall-powerpc-secplt-macro.S 
vacall-powerpc-macos.s vacall-powerpc64-aix.s vacall-powerpc64-linux.S 
vacall-powerpc64-elfv2-linux.S \
   vacall-ia64-macro.S \
   vacall-x86_64-macro.S vacall-x86_64-x32-linux.s 
vacall-x86_64-windows-macro.S \
   vacall-s390-macro.S vacall-s390x-macro.S \
@@ -157,6 +157,11 @@ vacall-powerpc-sysv4-macro.S : 
../../vacall/vacall-powerpc.c ../../vacall/vacall
        (../../common/asm-powerpc.sh < vacall-powerpc-sysv4.s ; cat 
../../common/noexecstack.h) > vacall-powerpc-sysv4-macro.S
        $(RM) vacall-powerpc-sysv4.s
 
+vacall-powerpc-secplt-macro.S : ../../vacall/vacall-powerpc.c 
../../vacall/vacall-internal.h vacall_r.h ../../common/asm-powerpc.sh 
../../common/noexecstack.h $(THISFILE)
+       $(CROSS_TOOL) powerpc-linux gcc -V 4.1.2 -mno-power -mno-power2 
-mno-powerpc -msecure-plt $(GCCFLAGS) -D__powerpc__ -S 
../../vacall/vacall-powerpc.c -I../../vacall -I. -o vacall-powerpc-secplt.s
+       (../../common/asm-powerpc.sh < vacall-powerpc-secplt.s ; cat 
../../common/noexecstack.h) > vacall-powerpc-secplt-macro.S
+       $(RM) vacall-powerpc-secplt.s
+
 vacall-powerpc-macos.s : ../../vacall/vacall-powerpc.c 
../../vacall/vacall-internal.h vacall_r.h $(THISFILE)
        $(CROSS_TOOL) powerpc-darwin gcc -V 3.3.6 $(GCCFLAGS) -D__powerpc__ -S 
../../vacall/vacall-powerpc.c -I../../vacall -I. -o vacall-powerpc-macos.s
 
diff --git callback/vacall_r/Makefile.in callback/vacall_r/Makefile.in
index 9d52db5..62cb87d 100644
--- callback/vacall_r/Makefile.in
+++ callback/vacall_r/Makefile.in
@@ -147,15 +147,16 @@ vacall-arm64.s : $(srcdir)/vacall-arm64-macro.S
 vacall-powerpc.lo : vacall-powerpc.s
        $(LIBTOOL_COMPILE) $(CC) @GCC_X_NONE@ -c vacall-powerpc.s
 
-vacall-powerpc.s : $(srcdir)/vacall-powerpc-aix.s 
$(srcdir)/vacall-powerpc-linux-macro.S $(srcdir)/vacall-powerpc-macos.s 
$(srcdir)/vacall-powerpc-sysv4-macro.S
+vacall-powerpc.s : $(srcdir)/vacall-powerpc-aix.s 
$(srcdir)/vacall-powerpc-linux-macro.S $(srcdir)/vacall-powerpc-macos.s 
$(srcdir)/vacall-powerpc-sysv4-macro.S $(srcdir)/vacall-powerpc-secplt-macro.S
        case "$(OS)" in \
          aix*) syntax=aix;; \
-         linux* | netbsd* | openbsd*) syntax=linux;; \
+         linux* | netbsd*) syntax=linux;; \
+         openbsd*) syntax=secplt;; \
          macos* | darwin*) syntax=macos;; \
          *) syntax=sysv4;; \
        esac; \
        case $${syntax} in \
-         linux | netbsd | sysv4) \
+         linux | sysv4 | secplt) \
            $(CPP) $(ASPFLAGS) -I$(srcdir) 
$(srcdir)/vacall-powerpc-$${syntax}-macro.S | grep -v '^ *#line' | grep -v '^#' 
| sed -e 's,% ,%,g' -e 's,//,@,g' -e 's,\$$,#,g' > vacall-powerpc.s || exit 1 
;; \
          macos) \
            grep -v '\.machine' $(srcdir)/vacall-powerpc-$${syntax}.s > 
vacall-powerpc.s || exit 1 ;; \
@@ -324,6 +325,7 @@ SOURCE_FILES = \
   vacall-powerpc-linux.s vacall-powerpc-linux-macro.S \
   vacall-powerpc-macos.s \
   vacall-powerpc-sysv4-macro.S \
+  vacall-powerpc-secplt-macro.S \
   vacall-powerpc64-aix.s vacall-powerpc64-linux.S 
vacall-powerpc64-elfv2-linux.S \
   vacall-riscv32-ilp32d-linux.s vacall-riscv32-ilp32d-macro.S \
   vacall-riscv64-lp64d-linux.s vacall-riscv64-lp64d-macro.S \
diff --git cross-tools/cross.conf cross-tools/cross.conf
index 23d3faa..e20abfe 100644
--- cross-tools/cross.conf
+++ cross-tools/cross.conf
@@ -16,7 +16,7 @@ arm64        aarch64-linux           5.4.0       2.24         
aarch64-linux
 rs6000       rs6000-aix              3.3.6       2.17         rs6000-aix
 rs6000       rs6000-aix6.1           5.4.0       2.17         rs6000-aix6.1
 powerpc      powerpc-darwin          3.3.6       2.17         ppc-macos
-powerpc      powerpc-linux           3.3.6       2.17         ppc-linux
+powerpc      powerpc-linux           3.3.6,4.1.2 2.17         ppc-linux
 powerpc64    powerpc64le-linux       5.4.0       2.24         powerpc64le-linux
 ia64         ia64-linux              4.0.1       2.16.1       ia64-linux
 x86_64       x86_64-linux            4.0.2,5.4.0 2.16.1       x86_64-linux
diff --git cross-tools/patches/gcc-4.1.2.patch 
cross-tools/patches/gcc-4.1.2.patch
new file mode 100644
index 0000000..297c241
--- /dev/null
+++ cross-tools/patches/gcc-4.1.2.patch
@@ -0,0 +1,21 @@
+diff -ru gcc-4.1.2/gcc/toplev.h gcc-4.1.2/gcc/toplev.h
+--- gcc-4.1.2/gcc/toplev.h     2005-09-08 17:47:05.000000000 -0700
++++ gcc-4.1.2/gcc/toplev.h     2019-10-16 10:05:49.377343593 -0700
+@@ -171,17 +171,6 @@
+ #  define CTZ_HWI __builtin_ctz
+ # endif
+ 
+-extern inline int
+-floor_log2 (unsigned HOST_WIDE_INT x)
+-{
+-  return x ? HOST_BITS_PER_WIDE_INT - 1 - (int) CLZ_HWI (x) : -1;
+-}
+-
+-extern inline int
+-exact_log2 (unsigned HOST_WIDE_INT x)
+-{
+-  return x == (x & -x) && x ? (int) CTZ_HWI (x) : -1;
+-}
+ #endif /* GCC_VERSION >= 3004 */
+ 
+ /* Functions used to get and set GCC's notion of in what directory



reply via email to

[Prev in Thread] Current Thread [Next in Thread]