Fix link error with Android NDK r9

Since Android ndk r9, __set_errno is deprecated. It is now defined as
inline function in errno.h. The syscall assembly calls __set_errno,
but since libc.so does not export it, the link fails. To workaround
this, replace all occurrences of __set_errno with a2_set_errno and
define it as normal C function.
pull/128/merge
Tatsuhiro Tsujikawa 2013-09-18 23:10:25 +09:00
parent fa09dc9115
commit e3a41a51da
6 changed files with 57 additions and 3 deletions

View File

@ -869,6 +869,7 @@ AC_SUBST([bashcompletiondir])
case "$host" in case "$host" in
*android*) *android*)
android=yes
LIBS="$LIBS -lstdc++ -lsupc++" LIBS="$LIBS -lstdc++ -lsupc++"
case "$host" in case "$host" in
arm-*) arm-*)
@ -886,6 +887,7 @@ case "$host" in
;; ;;
esac esac
AM_CONDITIONAL([ANDROID], [test "x$android" = "xyes"])
AM_CONDITIONAL([ANDROID_ARM], [test "x$android_arm" = "xyes"]) AM_CONDITIONAL([ANDROID_ARM], [test "x$android_arm" = "xyes"])
AM_CONDITIONAL([ANDROID_MIPS], [test "x$android_mips" = "xyes"]) AM_CONDITIONAL([ANDROID_MIPS], [test "x$android_mips" = "xyes"])
AM_CONDITIONAL([ANDROID_X86], [test "x$android_x86" = "xyes"]) AM_CONDITIONAL([ANDROID_X86], [test "x$android_x86" = "xyes"])

View File

@ -253,6 +253,10 @@ SRCS = option_processing.cc\
FtpTunnelRequestConnectChain.h\ FtpTunnelRequestConnectChain.h\
Lock.h Lock.h
if ANDROID
SRCS += android/android.c
endif # ANDROID
# Android NDK R8e does not provide ftruncate64. Use assembly code from # Android NDK R8e does not provide ftruncate64. Use assembly code from
# android source code and link it. # android source code and link it.
if ANDROID_ARM if ANDROID_ARM

48
src/android/android.c Normal file
View File

@ -0,0 +1,48 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2013 Tatsuhiro Tsujikawa
*
* 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 2 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include <errno.h>
/*
* Since Android ndk r9, __set_errno is deprecated. It is now defined
* as inline function in errno.h. The syscall assembly calls
* __set_errno, but since libc.so does not export it, the link
* fails. To workaround this, replace all occurrences of __set_errno
* with a2_set_errno and define it here.
*/
int a2_set_errno(int n)
{
errno = n;
return -1;
}

View File

@ -11,5 +11,5 @@ ENTRY(ftruncate64)
cmn r0, #(MAX_ERRNO + 1) cmn r0, #(MAX_ERRNO + 1)
bxls lr bxls lr
neg r0, r0 neg r0, r0
b __set_errno b a2_set_errno
END(ftruncate64) END(ftruncate64)

View File

@ -15,7 +15,7 @@ ftruncate64:
j $ra j $ra
nop nop
1: 1:
la $t9,__set_errno la $t9,a2_set_errno
j $t9 j $t9
nop nop
.set reorder .set reorder

View File

@ -17,7 +17,7 @@ ENTRY(ftruncate64)
jb 1f jb 1f
negl %eax negl %eax
pushl %eax pushl %eax
call __set_errno call a2_set_errno
addl $4, %esp addl $4, %esp
orl $-1, %eax orl $-1, %eax
1: 1: