我是 MacOS 和 MacOS 编程新手。我想知道应用程序是如何工作的(只需浏览一下二进制文件的导入系统 API 即可进行学习)。
我尝试了 otool,打印了帮助消息,我看到消息说-L 打印使用的共享库。然后我运行了otool -L <binary-file>,但它只打印了所使用的库的名称,没有任何导入的符号。
也许我错过了 otool 中的某些内容,或者是否有其他工具可以帮助在 mach-o 二进制文件中获取导入符号?
当在 M1 芯片上运行时使用 Xcode 13.3 构建时,我的一个 XCFrameworks 抛出以下错误。
__DATA/__bss 部分的类型为零填充,但对于架构 arm64 有非零文件偏移量
在 Monterey 上运行 Xcode 13.2.1 上的同一项目没有错误。在任何 Xcode 或 macOS 版本上运行的英特尔芯片也不会出现错误。
有没有人见过这个问题并知道潜在的解决方案?
我知道如果你在Mac OS的源代码中定义了一堆@""NSString对象.这些NSStrings将存储在Mach-O库中的一个段中.
Section
sectname __ustring
segname __TEXT
addr 0x000b3b54
size 0x000001b7
offset 731988
align 2^1 (2)
reloff 0
nreloc 0
flags 0x00000000
reserved1 0
reserved2 0
Run Code Online (Sandbox Code Playgroud)
如果我十六进制转储二进制文件,它们将一个接一个地与0x0000as分隔符紧密对齐.我想知道的是,当程序运行时,Mac OS X中的加载程序如何加载这些NSStrings?是否通过识别0x0000分隔符来简单地加载它们,或者这些是二进制文件中其他地方的字符串偏移表,指向单独的NSString对象?谢谢.
(我真正想要做的是增加一个NSString的长度,所以我必须知道加载器如何识别这些单独的对象)
补充:我知道如果在代码中定义类似@"abc"的CStrings,它将转到cstring段.如果它是一个像@"""这样的字符串,除了ascii字符,它将根据我的挖掘进入ustring部分.
有谁知道Mach-O LC_FUNCTION_STARTS命令指向的数据格式是什么?
我能找到的最多信息是在loader.h头文件中:
#define LC_FUNCTION_STARTS 0x26 /* compressed table of function start addresses */
Run Code Online (Sandbox Code Playgroud)
我看到dyldinfo工具有一个-function_starts选项来分析这些数据并且该工具是开源的,但该工具的最新发布版本不包含支持:
http://opensource.apple.com/source/ld64/ld64-97.2/src/other/dyldinfo.cpp
有谁知道我在哪里可以获得最新版本的dyldinfo的源代码,或者我可以获得有关此加载命令的更多信息?
谢谢!
我对在x86-64Mac OS X平台上进行汇编编程很感兴趣.我遇到了关于创建一个248B Mach-O程序的页面,这使我得到了Apple自己的Mach-O格式参考.之后我想我会在Xcode中制作同样简单的C程序并检查生成的程序集.
这是代码:
int main(int argc, const char * argv[])
{
return 42;
}
Run Code Online (Sandbox Code Playgroud)
但是生成的组件是334行,包含(基于248B模型)大量的过量内容.
首先,为什么在C可执行文件的Release版本中包含了如此多的DWARF调试信息?其次,我注意到Mach-O头数据被包含4次(在不同的DWARF相关中sections).为什么这有必要?最后,Xcode程序集包括:
.private_extern _main
.globl _main
_main:
.cfi_startproc
Run Code Online (Sandbox Code Playgroud)
但是在248B计划中,这些都无处可见 - 程序开始于_start.如果所有程序都按照定义开始,那怎么可能main呢?
全Xcode组装:
# Assembly output for main.c
# Generated at 4:04:08 PM on Sunday, January 20, 2013
# Using Release configuration, x86_64 architecture for Tiny target of Tiny project
.section __TEXT,__text,regular,pure_instructions
.file 1 "/Users/####/Desktop/Tiny/Tiny/main.c"
.section __DWARF,__debug_info,regular,debug
Lsection_info:
.section __DWARF,__debug_abbrev,regular,debug
Lsection_abbrev: …Run Code Online (Sandbox Code Playgroud) 我正在努力让一个项目与Parse和Facebook合作.运行此项目时,构建失败,我得到一个Mach-O Linker Error:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_SLComposeViewController", referenced from:
objc-class-ref in Parse(PF_Twitter.o)
"_OBJC_CLASS_$_SLRequest", referenced from:
objc-class-ref in Parse(PF_Twitter.o)
"_SLServiceTypeTwitter", referenced from:
-[PF_Twitter getAccessTokenForReverseAuthAsync:localTwitterAccount:] in Parse(PF_Twitter.o)
-[PF_Twitter getLocalTwitterAccountAsync] in Parse(PF_Twitter.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
ViewController.h:
#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
@interface ViewController : UIViewController
@end
// Implement both delegates
@interface DefaultSettingsViewController :
UIViewController <PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
而ViewController.m:
#import "ViewController.h"
@interface ViewController …Run Code Online (Sandbox Code Playgroud) 我在我的代码中添加了新的UITableView委托方法,突然我在编译时出现了一个错误.我的Xcode版本是Version 6.1(6A1046a)
Ld /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos/MedTests.xctest/MedTests normal arm64
cd /Users/apple/Documents/med
export IPHONEOS_DEPLOYMENT_TARGET=8.1
export PATH="/Applications/Xcode 2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode 2.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode\ 2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -bundle -isysroot /Applications/Xcode\ 2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk -L/Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos -F/Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos -F/Applications/Xcode\ 2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/Developer/Library/Frameworks -F/Applications/Xcode\ 2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks -F/Applications/Xcode\ 2.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/Developer/Library/Frameworks -filelist /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Intermediates/Med.build/Debug-iphoneos/MedTests.build/Objects-normal/arm64/MedTests.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -Xlinker -rpath -Xlinker @loader_path/Frameworks -dead_strip -bundle_loader /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos/Med.app/Med -framework XCTest -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=8.1 -Xlinker -dependency_info -Xlinker /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Intermediates/Med.build/Debug-iphoneos/MedTests.build/Objects-normal/arm64/MedTests_dependency_info.dat -o /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos/MedTests.xctest/MedTests
ld: file not found: /Users/apple/Library/Developer/Xcode/DerivedData/Med-emhoezxvdfnzwvfvktteeafyndtq/Build/Products/Debug-iphoneos/Med.app/Med
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
我也试过我的备份版本,但现在都没有,请帮助我
简而言之,当我db在我的.data部分中有多个部分时,编译的地址/标签在NASM编译时关闭.在我的测试中,它们在得到的Mach-O二进制文件中关闭了256个字节.
我使用的软件:
nasm NASM版本2.11.08,根据x84_64 ASM的要求通过Homebrew安装gobjdump GNU objdump(GNU Binutils)2.25.1,通过Homebrew安装clang Apple LLVM版本6.1.0(clang-602.0.53)(基于LLVM 3.6.0svn)以下面的"hello world"NASM程序集为例.
main.sglobal _main
section .text
_main:
mov rax, 0x2000004
mov rdi, 1
lea rsi, [rel msg]
mov rdx, len
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg: db "Hello, world!", 10
len: equ $ - msg
Run Code Online (Sandbox Code Playgroud)
编译并运行:
/usr/local/bin/nasm -f macho64 -o main.o main.s
clang -o main main.o
./main
Run Code Online (Sandbox Code Playgroud)
这很好用,并产生以下输出:
Hello, world!
Run Code Online (Sandbox Code Playgroud)
现在,要添加另一条消息,我们只需要在数据部分添加另一个字符串,另一个syscall …
我正在开发一个在Xcode之外开发的macOS dylib框架,我正在尝试理解该install_name选项的重要性.
例如,我可以将该LC_ID_DYLIB部分设置为name更像是在应用程序包的框架中使用install_name类似的参数.
clang++ ... -install_name @executable_path/../Frameworks/somelib.framework/Versions/somelib ...
Run Code Online (Sandbox Code Playgroud)
然后otool -l我可以看到我的名字已经在二进制文件中设置,与默认值不同(默认情况下与-o选项匹配).
otool -l somelib
...
cmd LC_ID_DYLIB
cmdsize 96
name @executable_path/../Frameworks/somelib.framework/Versions/A/somelib (offset 24)
time stamp 1 Wed Dec 31 19:00:01 1969
current version 1.0.0
compatibility version 1.0.0
....
Run Code Online (Sandbox Code Playgroud)
所以我理解如何设置它,但我不明白的是用什么值来确定它应该是什么,我也找不到任何文档.
我可以看到为什么这些LC_LOAD_DYLIB部分需要有关在哪里找到二进制文件的信息(因为这些部分引用了其他二进制文件),但为什么dylib需要有关在哪里找到自己的信息?链接它的二进制文件应该是找到它的二进制文件吗?
那么macOS dylib究竟是LC_ID_DYLIB install_name做什么的呢?
我正在尝试为 macOS实现一个微型编译器。我在配备 M1 的 MacBook Pro 上运行macOS 11.5。该assembly编码工作正常,我对这个结果(移交给锵编译和运行的时候就好了)很高兴。
我的问题是我找不到自己生成有效可执行文件的方法。我到了一个点,radare2 正确反汇编了可执行文件的每个部分,但是每次我尝试运行我的可执行文件时,我都会从终端获得 SIGKILL (9)。
我阅读了整个文件,因为我找不到关于 Mach-O 格式的任何其他文档来源。SPOILER:它的效果不是很好,这就是为什么我希望某种 Mach-O 巫师能够阅读此内容。
我的问题详细说明: Mach-O 标头很好。我的问题是关于加载命令。
我尝试注入以下段/命令:
但是无论我尝试什么(我什至尝试从其他可执行文件复制它们的值,然后我“替换”了入口点的地址以匹配我的),我都找不到使我的可执行文件工作的方法。
有谁知道我需要注入可执行文件及其值的确切加载命令是什么?
PS:如果有一种不使用 dyld 的方法,我会更高兴(我打算坚持使用系统调用)