nm实用程序获取.so文件中定义的内容会返回错误

时间:2014-06-01 00:37:43

标签: c++ macos shared-libraries nm

我需要获取.so文件中定义的符号。我使用最新的Mac OS,我这样做:

 /usr/bin/nm  -gC libs/armeabi/libhello.so 

错误:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm:无效参数-C 用法:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm [-agnopruUmxjlfAP [s segname sectname] [ - ] [-t format] [[-arch] ...] [档案......]

据我所知,这是另一种nm实用程序?它与XCode连接?如何解决这个问题?

编辑:添加创建.so文件的代码。

#include <android/log.h>
#include <stdio.h>
#include <jni.h>

       jint NativeAddition(JNIEnv *pEnv, jobject pObj, jint pa, jint pb)
       {
         return pa+pb;
       }

       jint NativeMultiplication(JNIEnv *pEnv, jobject pObj, jint pa,
       jint pb) {
         return pa*pb;
       }

       JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved)
       {
           JNIEnv* env;
           if ((*pVm)->GetEnv(pVm, (void **)&env, JNI_VERSION_1_6)) {
return -1; }
           JNINativeMethod nm[2];
           nm[0].name = "NativeAddition";
           nm[0].signature = "(II)I";
           nm[0].fnPtr = NativeAddition;
           nm[1].name = "NativeMultiplication";
           nm[1].signature = "(II)I";
           nm[1].fnPtr = NativeMultiplication;
           jclass cls = (*env)->FindClass(env, "com/example/hellondk/HelloNDKActivity");
           // Register methods with env->RegisterNatives.
           (*env)->RegisterNatives(env, cls, nm, 2);
           return JNI_VERSION_1_6;
}

此示例来自Android Native Development Kit Cookbook。

此处还有我nm

的使用消息
  

使用方法:   /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm   [-agnopruUmxjlfAP [s segname sectname] [ - ] [-t format] [[-arch   ] ...] [文件...]

2 个答案:

答案 0 :(得分:1)

在OS X中,没有用于解码符号的-C选项。

# nm libs/armeabi/libhello.so | c++filt -p -i

您可以改为use c++filt as a wrapper或如上所示调用它。

答案 1 :(得分:0)

安装macports,然后使用macports运行port install binutils

最后,运行gobjdump -p app