自 iOS 16.0 和 MacOS 13.0 起,MachO
getsegbyname
函数(请参阅此处)已被 Apple 标记为“已弃用”,并注明“不再支持”:
extern const struct segment_command *getsegbyname(
const char *segname) __CCTOOLS_DEPRECATED;
#define __CCTOOLS_DEPRECATED __API_DEPRECATED("No longer supported", macos(10.0, 13.0), ios(1.0, 16.0), watchos(1.0, 8.0), tvos(1.0, 16.0))
@available(iOS, introduced: 1.0, deprecated: 16.0, message: "No longer supported")
public func getsegbyname(_ segname: UnsafePointer<CChar>!) -> UnsafePointer<segment_command_64>!
是否存在应该使用其他函数而不是
getsegbyname
的一般原因?使用此功能是“不好的做法”吗?
这是一个简单实用的搜索功能,可以避免在某些情况下手动浏览 MachO 结构。
getsegbyname
函数仅存在于32位API中。而且,AFAICT,64 位 API 中从未存在过。
替代品似乎是:
getsectiondata
这是来自
getsect.h
的必要片段:
#ifndef __LP64__
/*
* Runtime interfaces for 32-bit Mach-O programs.
*/
extern const struct section *getsectbyname(
const char *segname,
const char *sectname) __CCTOOLS_DEPRECATED_MSG("use getsectiondata(&__dso_handle,)");
extern uint8_t *getsectiondata(
const struct mach_header *mhp,
const char *segname,
const char *sectname,
unsigned long *size);
extern const struct segment_command *getsegbyname(
const char *segname) __CCTOOLS_DEPRECATED;
extern uint8_t *getsegmentdata(
const struct mach_header *mhp,
const char *segname,
unsigned long *size);
#else /* defined(__LP64__) */
/*
* Runtime interfaces for 64-bit Mach-O programs.
*/
extern const struct section_64 *getsectbyname(
const char *segname,
const char *sectname);
extern uint8_t *getsectiondata(
const struct mach_header_64 *mhp,
const char *segname,
const char *sectname,
unsigned long *size);
extern const struct segment_command_64 *getsegbyname(
const char *segname) __CCTOOLS_DEPRECATED;
extern uint8_t *getsegmentdata(
const struct mach_header_64 *mhp,
const char *segname,
unsigned long *size);
#endif /* defined(__LP64__) */
请注意,
getsegbyname
仅具有通用弃用消息,但getsectbyname
具有use getsectiondata(&__dso_handle,)
从 [V8] getsectdatafromheader_64 在 macOS 13.0 #45 中已弃用,它具有:
在 macOS 13.0 上构建将会失败,因为
getsectdatafromheader_64
自 13.0 起已弃用,已被getsectiondata()
取代。
getsectiondata
似乎是未来的替代品(对于多个功能)。而且,它在 32 位 API 和 64 位 API 中都存在(已经存在)。