Извлечение имен функций из статической библиотеки
У меня есть статическая библиотека static_library.a
Как перечислить реализованные там функции и методы. или хотя бы как посмотреть реализована ли конкретная функция 'FUNCTION_NAME'?
2 ответа
Написать
nm static_library.a
Это дает вам полный список символов в библиотеке.
Использование nm <library>
как уже упоминалось.
Если это библиотека, построенная из C++, вы должны использовать nm --demangle
возможность вернуть исходные имена символов, а не их искаженные версии.
nm
команда предоставляет информацию о символах, используемых в объектном файле или исполняемом файле.
$ nm <object file or executable name>
Выход выглядит как
libObjCUtils.a(GFICClassA.o):
0000000000000000 t +[GFICClassA GFICclassMethod1::]
00000000000001d0 t -[GFICClassA GFICGlobalPropertyNSString1]
00000000000000b0 t -[GFICClassA GFICinstanceMethod1::]
Вы можете найти образцы здесь
Информация по умолчанию, что nm
Команда обеспечивает это:
- Виртуальный адрес символа
- Символ, который изображает тип символа. Если символ в нижнем регистре, то символ является локальным, но если символ в верхнем регистре, то символ является внешним
- Название символа
Символы, которые идентифицируют тип символа, описывают:
- A: Глобальный абсолютный символ.
- а: местный абсолютный символ
- B: Глобальный символ bss.
- b: местный символ bss
- D: Глобальный символ данных.
- d: локальный символ данных.
- f: символ имени исходного файла.
- L: Глобальный локальный символ потока (TLS).
- l: Статический локальный символ потока (TLS).
- Т: Глобальный текстовый символ.
- t: локальный текстовый символ.
- U: неопределенный символ.
Узнайте больше здесь
В 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
Вы можете найти образцы здесь