替代已弃用的 MachO getsegbyname 函数?

问题描述 投票:0回答:1

自 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 结构。

ios c swift macos mach-o
1个回答
0
投票

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 中都存在(已经存在)。

© www.soinside.com 2019 - 2024. All rights reserved.