Crosscompile Perl for Android x86
I like crossover Perl for x86 emulator for Android. But I got a PIE (position of independent executables) error when running Configure ... Based on this and this tutorial.
Specifications:
- NDK Version 14
- Perl 5.22.1.
- x86 Android emulator built with AOSP - Android 7.1.1
I have set the following variables:
export ANDROID_NDK=/home/fabian/Android/Sdk/ndk-bundle
export TARGET_ARCH=x86
export ANDROID_TOOLCHAIN=/tmp/toolchain-x86
export SYSROOT=$ANDROID_TOOLCHAIN/sysroot
export TARGETDIR=/data/local/perl
export GCC=i686-linux-android-gcc
export PATH=$PATH:$ANDROID_NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin
Then I create the toolchain with the following command:
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --platform=android-23 --install-dir=$ANDROID_TOOLCHAIN --toolchain=x86-4.9
and get this (correct?) output:
HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=4
BUILD_NUM_CPUS=8
Auto-config: --arch=x86
Toolchain installed to /tmp/toolchain-x86.
Then I run the command ./Configure
:
./Configure -des -Dusedevel -Dusecrosscompile -Dtargetrun=adb -Dcc=i686-linux-android-gcc -Dsysroot=$SYSROOT -Dtargetdir=$TARGETDIR -Dtargethost=emulator-5554
and got this output:
First let make sure your kit is complete. Checking ...
Would you like to see the instructions? [n]
Locating common programs ...
Checking compatibility between / bin / echo and builtin echo (if any) ...
Symbolic links are supported.
Checking how to test for symbolic links ...
You can test for symbolic links with 'test -h'.
Using targetarch i686-linux-android.
Using targethost emulator-5554.
Building host miniperl and generate_uudmap binaries
Using targethost emulator-5554.
Guessing targetuser root.
Guessing targetport 22.
Using '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/run-adb' for remote execution,
and '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/from-scp' and '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/to-scp'
for remote file transfer.
Good, your tr supports [: lower:] and [: upper:] to convert case.
Using [: upper:] and [: lower:] to convert case.
aix_3 dragonfly irix_4 nonstopux stellar
aix_4 dynixptx irix_5 openbsd sunos_4_0
aix dynix irix_6_0 opus sunos_4_1
altos486 epix irix_6_1 os2 super-ux
amigaos esix4 irix_6 os390 svr4
atheos fps isc_2 os400 svr5
aux_3 freebsd isc posix-bc ti1500
bitrig freemint linux-android powerux ultrix_4
bsdos genix linux qnx umips
catamount gnukfreebsd lynxos riscos unicosmk
convexos gnuknetbsd midnightbsd sco_2_3_0 unicos
cxux gnu mips sco_2_3_1 unisysdynix
cygwin greenhills mirbsd sco_2_3_2 utekv
darwin haiku mpc sco_2_3_3 uwin
dcosx hpux ncr_tower sco_2_3_4 vos
dec_osf i386 netbsd sco
dos_djgpp interix newsos4 solaris_2
Which of these apply, if any? [linux-android]
"./a.out": error: only position independent executables (PIE) are supported.
Aborted
You don't have an ELF gcc. I will use dld if possible. If you are
using a version of DLD earlier than 3.2.6, or don't have it at all, you
should probably upgrade. If you are forced to use 3.2.4, you should
uncomment a couple of lines in hints / linux.sh and restart Configure so
that shared libraries will be disallowed.
Disabling ndbm. This will generate a Whoa There message in Configure.
Read hints / linux.sh for further information.
Operating system name? [linux-android]
Operating system version? [7.1.1]
Installation prefix to use? (~ name ok) [/ usr / local]
AFS does not seem to be running ...
What installation prefix should I use for installing files? (~ name ok)
[/ usr / local]
Getting the current patchlevel ...
Build a threading Perl? [n]
Build Perl for multiplicity? [n]
Use which C compiler? [i686-linux-android-gcc]
Checking for GNU cc in disguise and / or its version number ...
"./try": error: only position independent executables (PIE) are supported.
Aborted
Now, how can we feed standard input to your C preprocessor ...
Directories to use for library searches?
[/tmp/toolchain-x86/sysroot/usr/lib/../lib / tmp / toolchain-x86 / sysroot / usr / lib]
What is the file extension used for shared libraries? [sa]
Make shared library basenames unique? [n]
Hmm. Based on the hints in hints / linux-android.sh,
the recommended value for $ d_libname_unique on this machine was "define"!
Keep the recommended value? [y]
Build Perl for SOCKS? [n]
Try to use long doubles if available? [n]
Checking for optional libraries ...
What libraries to use? [-lm -lc]
What optimizer / debugger flag should be used? [-O2]
Any additional cc flags?
[-DOVR_DBL_DIG = 14 --sysroot = / tmp / toolchain-x86 / sysroot]
Let me guess what the preprocessor flags are ...
Any additional ld flags (NOT including libraries)?
[--sysroot = / tmp / toolchain-x86 / sysroot]
Checking your choice of C compiler and flags for coherency ...
I've tried to compile and run the following simple program:
#include
int main () {printf ("Ok \ n"); return (0); }
I used the command:
i686-linux-android-gcc -o try -O2 -DOVR_DBL_DIG = 14 --sysroot = / tmp / toolchain-x86 / sysroot --sysroot = / tmp / toolchain-x86 / sysroot try.c -lm -lc
/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/run-adb-shell ./try
and I got the following output:
The program compiled OK, but exited with status 134.
You have a problem. Shall I abort Configure [y]
Ok. Stopping Configure.
OK I need to set flags
Modify config.sh to enable PIE support. Add "-fPIE" to ccflags and "-fPIE -pie" to ldflags. Then repeat the setup to make sure it's attached.
But there is no perl in the folder config.sh
, so I tried this command ./Configure
:
`./Configure -des -Dusedevel -Dusecrosscompile -Dtargetrun = adb -Dcc = i686-linux-android-gcc -Dsysroot = $ SYSROOT -Dtargetdir = $ TARGETDIR -Dtargethost = emulator-5554 -Dccflags = '- fPIE =' Dldflags -fPIE -pie ' '
but again the problem ...
First let make sure your kit is complete. Checking ...
Would you like to see the instructions? [n]
Locating common programs ...
Checking compatibility between / bin / echo and builtin echo (if any) ...
Symbolic links are supported.
Checking how to test for symbolic links ...
You can test for symbolic links with 'test -h'.
Using targetarch i686-linux-android.
Using targethost emulator-5554.
Building host miniperl and generate_uudmap binaries
Using targethost emulator-5554.
Guessing targetuser root.
Guessing targetport 22.
Using '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/run-adb' for remote execution,
and '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/from-scp' and '/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/to-scp'
for remote file transfer.
Good, your tr supports [: lower:] and [: upper:] to convert case.
Using [: upper:] and [: lower:] to convert case.
aix_3 dragonfly irix_4 nonstopux stellar
aix_4 dynixptx irix_5 openbsd sunos_4_0
aix dynix irix_6_0 opus sunos_4_1
altos486 epix irix_6_1 os2 super-ux
amigaos esix4 irix_6 os390 svr4
atheos fps isc_2 os400 svr5
aux_3 freebsd isc posix-bc ti1500
bitrig freemint linux-android powerux ultrix_4
bsdos genix linux qnx umips
catamount gnukfreebsd lynxos riscos unicosmk
convexos gnuknetbsd midnightbsd sco_2_3_0 unicos
cxux gnu mips sco_2_3_1 unisysdynix
cygwin greenhills mirbsd sco_2_3_2 utekv
darwin haiku mpc sco_2_3_3 uwin
dcosx hpux ncr_tower sco_2_3_4 vos
dec_osf i386 netbsd sco
dos_djgpp interix newsos4 solaris_2
Which of these apply, if any? [linux-android]
"./a.out": error: only position independent executables (PIE) are supported.
Aborted
You don't have an ELF gcc. I will use dld if possible. If you are
using a version of DLD earlier than 3.2.6, or don't have it at all, you
should probably upgrade. If you are forced to use 3.2.4, you should
uncomment a couple of lines in hints / linux.sh and restart Configure so
that shared libraries will be disallowed.
Disabling ndbm. This will generate a Whoa There message in Configure.
Read hints / linux.sh for further information.
Operating system name? [linux-android]
Operating system version? [7.1.1]
Installation prefix to use? (~ name ok) [/ usr / local]
AFS does not seem to be running ...
What installation prefix should I use for installing files? (~ name ok)
[/ usr / local]
Getting the current patchlevel ...
Build a threading Perl? [n]
Build Perl for multiplicity? [n]
Use which C compiler? [i686-linux-android-gcc]
Checking for GNU cc in disguise and / or its version number ...
"./try": error: only position independent executables (PIE) are supported.
Aborted
Now, how can we feed standard input to your C preprocessor ...
Directories to use for library searches?
[/tmp/toolchain-x86/sysroot/usr/lib/../lib / tmp / toolchain-x86 / sysroot / usr / lib]
What is the file extension used for shared libraries? [sa]
Make shared library basenames unique? [n]
Hmm. Based on the hints in hints / linux-android.sh,
the recommended value for $ d_libname_unique on this machine was "define"!
Keep the recommended value? [y]
Build Perl for SOCKS? [n]
Try to use long doubles if available? [n]
Checking for optional libraries ...
What libraries to use? [-lm -lc]
What optimizer / debugger flag should be used? [-O2]
Any additional cc flags?
[-DOVR_DBL_DIG = 14 -fPIE --sysroot = / tmp / toolchain-x86 / sysroot]
Let me guess what the preprocessor flags are ...
Any additional ld flags (NOT including libraries)?
[--sysroot = / tmp / toolchain-x86 / sysroot]
Checking your choice of C compiler and flags for coherency ...
I've tried to compile and run the following simple program:
#include
int main () {printf ("Ok \ n"); return (0); }
I used the command:
i686-linux-android-gcc -o try -O2 -DOVR_DBL_DIG = 14 -fPIE --sysroot = / tmp / toolchain-x86 / sysroot --sysroot = / tmp / toolchain-x86 / sysroot try.c -lm -lc
/home/fabian/Desktop/Testimages/perl-5.22.1/Cross/run-adb-shell ./try
and I got the following output:
"./try": error: only position independent executables (PIE) are supported.
Aborted
The program compiled OK, but exited with status 134.
You have a problem. Shall I abort Configure [y]
Ok. Stopping Configure.
But now ccflag is installed as you can see in the last lines ...
Did I miss something?
source to share
No one has answered this question yet
Check out similar questions: