2014-08-31 31 views
3

是否有ld(1)选项在ARM平台上提供等效于--exclude-libs ALL的选项?ARM等价物“--exclude-libs ALL”

我试图减小Android上的共享对象的大小,但--exclude-libs ALL仅在x86上可用。


编辑:这里是我问原因。对不起,这个额外的细节。我试图保持简短的问题。我的共享对象不是导出任何Crypto ++符号,但是88显示出而没有--exclude-libs ALL

这里有感兴趣的envars:

$ echo $CXX 
arm-linux-androideabi-g++ 
$ echo $ANDROID_STL_INC 
/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ 
$ echo $ANDROID_SYSROOT 
/opt/android-ndk-r9/platforms/android-9/arch-arm 

首先,建立我的共享对象没有--exclude-libs ALL

$ $CXX -fPIC -Os -I/usr/local/cryptopp-android-9/include -I$ANDROID_STL_INC 
    --sysroot=$ANDROID_SYSROOT com_deltoid_androidprng_PRNG.cpp 
    -o libprng.so -shared 

再算上加密+出口数量:

$ arm-linux-androideabi-nm --defined-only libprng.so | grep -i cryptopp | wc -l 
     88 

二,同样的实验--exclude-libs ALL

$ $CXX -fPIC -Os -I/usr/local/cryptopp-android-9/include -I$ANDROID_STL_INC 
    --sysroot=$ANDROID_SYSROOT com_deltoid_androidprng_PRNG.cpp 
    -o libprng.so -shared -Wl,--exclude-libs,ALL 

再算上加密++出口数量:

$ arm-linux-androideabi-nm --defined-only libprng.so | grep -i cryptopp | wc -l 
     88 

在两种情况下,88个加密++符号已出口。源文件在下面,它不会导出任何Crypto ++符号。


#include <string.h> 
#include <jni.h> 

#include <cryptopp/osrng.h> 
using CryptoPP::AutoSeededRandomPool; 

#include "com_deltoid_androidprng_PRNG.h" 

static AutoSeededRandomPool& GetPRNG() 
{ 
    static AutoSeededRandomPool prng; 

    return prng; 
} 

static int IncorporateSensors() 
{ 
    return 0; 
} 

/* 
* Class:  com_deltoid_androidprng_PRNG 
* Method: CryptoPP_Reseed 
* Signature: ([B)I 
*/ 
jint JNICALL Java_com_deltoid_androidprng_PRNG_CryptoPP_1Reseed 
    (JNIEnv* env, jclass, jbyteArray seed) 
{ 
    int ret, consumed = 0; 

    try 
    { 
     AutoSeededRandomPool& prng = GetPRNG(); 

     if(env) 
     { 
      jbyte* bytes = env->GetByteArrayElements(seed, 0); 
      jint length = env->GetArrayLength(seed); 

      if(bytes) 
      { 
       if(length >= 0) 
       { 
        prng.IncorporateEntropy((const byte*)bytes, (size_t)length); 
        consumed += length; 
       } 

       env->ReleaseByteArrayElements(seed, bytes, JNI_ABORT); 
      }     
     }   
    } 
    catch(const CryptoPP::Exception& ex) 
    { 
    } 

    return consumed; 
} 

/* 
* Class:  com_deltoid_androidprng_PRNG 
* Method: CryptoPP_GetBytes 
* Signature: ([B)I 
*/ 
JNIEXPORT jint JNICALL Java_com_deltoid_androidprng_PRNG_CryptoPP_1GetBytes 
    (JNIEnv *, jclass, jbyteArray) 
{  
} 
+0

它不被识别或不能正常工作吗? – auselen 2014-08-31 06:31:30

+0

@auselen - 它看起来没有起作用。 – jww 2014-08-31 13:08:39

+0

@Notlikethat - 是的,我读到了。但它似乎并没有在实践中发挥作用(或者它只在本例中适用于i386)。 – jww 2014-08-31 13:09:20

回答

2

我敢肯定--exclude-libs是由ld的Android/ARM版本的支持,因为他们使用它themselves as well

您在Android.mk文件中试过类似下面的内容吗?

LOCAL_LDFLAGS += -Wl,--exclude-libs,ALL 
+0

谢谢@auselen。我通过源代码和编译器/链接器调用添加了更多细节。对于额外的细节抱歉。我试图保持简短的问题。 (我不得不放弃Eclipse和Android.mk,我无法让任何一个人工作,于是我回到了命令行,我知道它始终工作)。 – jww 2014-08-31 13:21:30