2014-08-31 126 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