__weak 说明

摘要翻译by changliang

__weak
1. 一种编译宏,用于函数声明或者定义;
2. 声明变量或函数时,可以不实现也不会报unresolved的错误。
3. 定义变量或函数时,使用同于普通函数,只是在系统中还有同名的没有用__weak宏定义的函数时,系统调用不加__weak的函数。
  4. 使用限制: 声明变量或函数,同一次编译下只能取一种性质,要么是weak,要么是nonweak;定义变量或函数时,不能用于inline

原英文地址:

http://www.keil.com/support/man/docs/armccref/armccref_CHDHHIGB.htm

 

 

### 关于 LC_BASE_DIR_WEAK 的定义与使用 #### 定义 `LC_BASE_DIR_WEAK` 是 Mach-O 加载命令的一种类型,用于指定弱依赖的基础路径。它允许程序在运行时尝试加载某个动态库,但如果该库不存在,则不会导致程序崩溃。这种机制通常用于可选的功能模块或插件支持。 其具体结构可以通过 `struct dylib_command` 来描述,其中包含了路径和其他元数据的信息[^2]。以下是相关的字段说明: - **cmd**: 表示命令类型的常量值,对于 `LC_BASE_DIR_WEAK` 而言,它的值固定为特定的枚举值。 - **cmdsize**: 命令大小,单位为字节。 - **name_offset**: 动态库名称相对于负载命令区域起始位置的偏移量。 - **timestamp**: 库的时间戳,用于版本控制。 - **current_version**: 当前库的版本号。 - **compatibility_version**: 兼容性版本号。 #### 使用方法 要使用 `LC_BASE_DIR_WEAK`,开发者可以在构建阶段通过链接器选项来设置基础路径。例如,在 Xcode 或者命令行工具中,可以利用 `-weak_framework` 参数来声明弱依赖框架的位置。这种方式会自动将对应的加载指令嵌入到二进制文件中。 当操作系统加载应用程序时,如果检测到存在 `LC_BASE_DIR_WEAK` 类型的加载命令,则会按照指定的基础路径寻找目标动态库。如果没有找到匹配项,则跳过此步骤并继续执行其余逻辑[^3]。 #### 示例代码 下面展示了一个简单的例子,演示如何手动解析包含 `LC_BASE_DIR_WEAK` 的 Mach-O 文件头信息: ```c #include <stdio.h> #include <mach-o/loader.h> void parse_macho(const char* filename) { FILE* fp = fopen(filename, "rb"); if (!fp) { perror("Failed to open file"); return; } struct mach_header_64 header; fread(&header, sizeof(header), 1, fp); printf("Magic Number: %x\n", header.magic); printf("CPU Type: %d\n", header.cputype); printf("File Type: %d\n", header.filetype); printf("Number of Load Commands: %d\n", header.ncmds); off_t offset = sizeof(struct mach_header_64); for (int i = 0; i < header.ncmds; ++i) { struct load_command cmd; fseek(fp, offset, SEEK_SET); fread(&cmd, sizeof(cmd), 1, fp); if (cmd.cmd == LC_BASE_DIR_WEAK) { struct dylib_command weak_cmd; fseek(fp, offset, SEEK_SET); fread(&weak_cmd, sizeof(weak_cmd), 1, fp); const char* name = ((char*)&weak_cmd) + weak_cmd.dylib.name.offset; printf("Found LC_BASE_DIR_WEAK with path: %s\n", name); } offset += cmd.cmdsize; } fclose(fp); } ``` 以上 C 程序片段展示了读取 Mach-O 头部以及遍历所有加载命令的过程。特别注意的是针对 `LC_BASE_DIR_WEAK` 的处理部分,提取出了关联的动态库路径字符串。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值