引言

iOS常用预处理指令:

  1. 移除程序中的指定标识符。
  2. DEBUG宏区分调试模式和发布模式进行特殊处理。
  3. 导出和隐藏符号。

I 移除程序中的指定identifier(标识符)

#pragma clang poison ​​identifier​

应用场景:禁止使用ObjC 的运行时API

  • 例子:
#pragma

iOS小技能:常用预处理指令_iOS

II DEBUG 宏的应用

1、原文:​​kunnan.blog.csdn.net/article/det…​​ 2、应用场景:区分调试模式和发布模式进行特殊处理 3、The DEBUG preprocessor macro setting in an Xcode project

iOS小技能:常用预处理指令_编译参数_02

4、发布模式关闭NSLog

//调试模式
#ifdef
#define
#define

//#define NSLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#else//发布模式
#define
#define
#endif

III 导出和隐藏符号

3.1 导出符号信息

  • 查看导出符号信息:​​nm -gm tmp_64.dylib​

(__DATA,__data) external

(undefined) external _CFDataCreate (from CoreFoundation) (undefined) external _CFNotificationCenterGetDarwinNotifyCenter (from CoreFoundation) (__TEXT,__text) external (undefined) external _IOObjectRelease (from IOKit) (undefined) external _IORegistryEntryCreateCFProperty (from IOKit) 000000010ffa3f97 (__DATA,__objc_data) external OBJC_CLASS_BslyjNwZmPCJkVst 000000010ffa3f97 (__DATA,__objc_data) external _OBJC_CLASS__ChiDDQmRSQpwQJgm

3.2 控制符号是否导出

  • static 参数修饰,不会导出符号信息
static char _person_name[30] = {'\0'};
  • 在编译参数中加入​​-exported_symbols_list export_list​
CC = xcrun --sdk iphoneos clang
ARCH = arm64
FRAMEWORK = -framework Foundation
VERSION = -compatibility_version 1 -current_version 1
  • 在Makefile编译参数中指定-fvisibility=hidden,对指定符号增加visibility(“default”)来导出符号

1、在Makefile编译参数中指定​​-fvisibility=hidden​

CC = xcrun --sdk iphoneos clang++
ARCH = arm64
FRAMEWORK = -framework Foundation
VERSION = -compatibility_version 1 -current_version 1

2、对指定符号增加visibility(“default”)来导出符号

#define EXPORT __attribute__((visibility("default")))

see also

进一步交流,欢迎搜索小程序:iOS逆向。