从静态库中提取函数名称

时间:2010-04-26 14:35:13

标签: unix extraction static-libraries

我有一个静态库static_library.a

如何列出那里实现的功能和方法。 或者至少如何看待“FUNCTION_NAME”实现的具体功能?

4 个答案:

答案 0 :(得分:31)

nm static_library.a

这为您提供了库中符号的完整列表。

答案 1 :(得分:13)

如上所述使用nm <library>

如果这是一个用C ++构建的库,你应该使用nm --demangle选项来取回原始的符号名称,而不是它们的“受损”版本。

答案 2 :(得分:1)

nm命令提供有关在目标文件或可执行文件中使用的符号的信息。

$ nm <object file or executable name>

输出看起来像

libObjCUtils.a(GFICClassA.o):
0000000000000000 t +[GFICClassA GFICclassMethod1::]
00000000000001d0 t -[GFICClassA GFICGlobalPropertyNSString1]
00000000000000b0 t -[GFICClassA GFICinstanceMethod1::]

您可以找到示例here

nm命令提供的默认信息是:

  • 符号的虚拟地址
  • 一个描述符号类型的字符。如果字符是小写字母,则符号是局部符号;如果字符是大写字母,则符号是外部符号
  • 符号名称

标识符号类型的字符描述:

  • A:全局绝对符号。
  • a:本地绝对符号。
  • B:全局bss符号。
  • b:本地bss符号。
  • D:全局数据符号。
  • d:本地数据符号。
  • f:源文件名符号。
  • L:全局线程本地符号(TLS)。
  • l:静态线程本地符号(TLS)。
  • T:全局文本符号。
  • t:本地文字符号。
  • U:未定义符号。

了解更多here

答案 3 :(得分:0)

nm列出了目标文件中的符号

$ nm <object file or executable name>

让我们看一个例子:

//GFICClassA.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface GFICClassA : NSObject
//global constants
extern int const GFIC_GLOBAL_EXTERN_CONST_INT_1;

extern NSInteger const GFIC_GLOBAL_EXTERN_CONST_NSInteger_1;
extern NSString *const GFIC_GLOBAL_EXTERN_CONST_NSString_1;

//Public properties first
@property (nonatomic, strong) NSString *GFICGlobalPropertyNSString1;

//class methods
+ (NSString*)GFICclassMethod1:(NSString*)arg1 :(NSString*)arg2;

//instance methods
- (NSString*)GFICinstanceMethod1:(NSString*)arg1 :(NSString*)arg2;

- (void) GFICprintHelloWorld;
@end

NS_ASSUME_NONNULL_END
//GFICClassA.m
#import "GFICClassA.h"

// Declare global constants
int const GFIC_GLOBAL_EXTERN_CONST_INT_1 = 1;

NSInteger const GFIC_GLOBAL_EXTERN_CONST_NSInteger_1 = 1;
NSString *const GFIC_GLOBAL_EXTERN_CONST_NSString_1 = @"GFIC_GLOBAL_EXTERN_CONST_NSString_1_value";

// Declare local constants
static NSString *const GFIC_LOCAL_STATIC_CONS_1 = @"GFIC_LOCAL_STATIC_CONS_1_value";

@interface GFICClassA ()

@property (strong, nonatomic) NSString *GFICLocalPropertyNSString2;

@end

@implementation GFICClassA
//class methods
+ (NSString*)GFICclassMethod1:(NSString*)arg1 :(NSString*)arg2 {
    printf("GFI classMethod1 called");

    return @"GFI classMethod1_result";
}

//instance methods
- (NSString*)GFICinstanceMethod1:(NSString*)arg1 :(NSString*)arg2{
    printf("GFI instanceMethod1 called");

    self.GFICGlobalPropertyNSString1 = @"gfiGlobalPropertyNSString1_value";
    self.GFICLocalPropertyNSString2 = @"gfiLocalPropertyNSString2_value";


    return GFIC_GLOBAL_EXTERN_CONST_NSString_1;
}

- (void) GFICprintHelloWorld {
    NSLog(@"Hello World! from ObjC");
}
@end
nm -U libObjCUtils.a
//-U Don't display undefined symbols.

输出看起来像

libObjCUtils.a(GFICClassA.o):
0000000000000000 t +[GFICClassA GFICclassMethod1::]
0000000000000290 t -[GFICClassA .cxx_destruct]
00000000000001d0 t -[GFICClassA GFICGlobalPropertyNSString1]
0000000000000230 t -[GFICClassA GFICLocalPropertyNSString2]
00000000000000b0 t -[GFICClassA GFICinstanceMethod1::]
00000000000001a0 t -[GFICClassA GFICprintHelloWorld]
00000000000001f0 t -[GFICClassA setGFICGlobalPropertyNSString1:]
0000000000000250 t -[GFICClassA setGFICLocalPropertyNSString2:]
00000000000002e8 S _GFIC_GLOBAL_EXTERN_CONST_INT_1
00000000000002f0 S _GFIC_GLOBAL_EXTERN_CONST_NSInteger_1
0000000000000538 S _GFIC_GLOBAL_EXTERN_CONST_NSString_1
0000000000000540 s _GFIC_LOCAL_STATIC_CONS_1
00000000000008a8 S _OBJC_CLASS_$_GFICClassA
0000000000000658 S _OBJC_IVAR_$_GFICClassA._GFICGlobalPropertyNSString1
0000000000000660 S _OBJC_IVAR_$_GFICClassA._GFICLocalPropertyNSString2
0000000000000880 S _OBJC_METACLASS_$_GFICClassA
00000000000006b0 s l_OBJC_$_CLASS_METHODS_GFICClassA
0000000000000718 s l_OBJC_$_INSTANCE_METHODS_GFICClassA
00000000000007c8 s l_OBJC_$_INSTANCE_VARIABLES_GFICClassA
0000000000000810 s l_OBJC_$_PROP_LIST_GFICClassA
0000000000000838 s l_OBJC_CLASS_RO_$_GFICClassA
00000000000006d0 s l_OBJC_METACLASS_RO_$_GFICClassA

您可以找到示例here