标签: mach-o

如何打印 mach-o 二进制文件从 dylibs 导入的所有符号?

我是 MacOS 和 MacOS 编程新手。我想知道应用程序是如何工作的(只需浏览一下二进制文件的导入系统 API 即可进行学习)。

我尝试了 otool,打印了帮助消息,我看到消息说-L 打印使用的共享库。然后我运行了otool -L <binary-file>,但它只打印了所使用的库的名称,没有任何导入的符号。

也许我错过了 otool 中的某些内容,或者是否有其他工具可以帮助在 mach-o 二进制文件中获取导入符号?

macos mach-o otool

5
推荐指数
1
解决办法
3457
查看次数

Xcode 13.3/XCFramework 编译错误:__DATA/__bss 部分的类型为零填充,但架构 arm64 的文件偏移量非零

当在 M1 芯片上运行时使用 Xcode 13.3 构建时,我的一个 XCFrameworks 抛出以下错误。

__DATA/__bss 部分的类型为零填充,但对于架构 arm64 有非零文件偏移量

在 Monterey 上运行 Xcode 13.2.1 上的同一项目没有错误。在任何 Xcode 或 macOS 版本上运行的英特尔芯片也不会出现错误。

有没有人见过这个问题并知道潜在的解决方案?

xcode mach-o ios xcframework macos-monterey

5
推荐指数
1
解决办法
1465
查看次数

Mach-O加载器如何加载不同的NSString对象?

我知道如果你在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部分.

macos mach-o objective-c loader

4
推荐指数
1
解决办法
895
查看次数

Mach-O文件LC_FUNCTION_STARTS加载命令

有谁知道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的源代码,或者我可以获得有关此加载命令的更多信息?

谢谢!

macos mach-o dyld

4
推荐指数
2
解决办法
2127
查看次数

基本OS X程序集和Mach-O格式

我对在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)

macos assembly x86-64 mach-o dwarf

4
推荐指数
1
解决办法
2914
查看次数

为什么我收到Apple Mach-O Linker错误?

我正在努力让一个项目与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)

mach-o objective-c ios parse-platform

4
推荐指数
1
解决办法
5762
查看次数

xcode 6中的Apple Mach-O链接器错误

我在我的代码中添加了新的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)

我也试过我的备份版本,但现在都没有,请帮助我

mach-o objective-c clang ios xcode6.1

4
推荐指数
2
解决办法
2万
查看次数

使用多个db声明时,NASM编译x86_64 ASM标签在Mach-O中关闭256个字节?

简而言之,当我db在我的.data部分中有多个部分时,编译的地址/标签在NASM编译时关闭.在我的测试中,它们在得到的Mach-O二进制文件中关闭了256个字节.

我使用的软件:

  • OS X 10.10.5
  • 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.s

global _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 …

assembly x86-64 mach-o nasm data-segment

4
推荐指数
1
解决办法
405
查看次数

macOS Mach-O dylib LC_ID_DYLIB名称或install_name的意义是什么?

我正在开发一个在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 mach-o clang dylib mach

4
推荐指数
1
解决办法
749
查看次数

手工制作的 macOS 可执行文件

我正在尝试为 macOS实现一个微型编译器。我在配备 M1 的 MacBook Pro 上运行macOS 11.5。该assembly编码工作正常,我对这个结果(移交给锵编译和运行的时候就好了)很高兴。

我的问题是我找不到自己生成有效可执行文件的方法。我到了一个点,radare2 正确反汇编了可执行文件的每个部分,但是每次我尝试运行我的可执行文件时,我都会从终端获得 SIGKILL (9)。

我阅读了整个文件,因为我找不到关于 Mach-O 格式的任何其他文档来源。SPOILER:它的效果不是很好,这就是为什么我希望某种 Mach-O 巫师能够阅读此内容。

我的问题详细说明: Mach-O 标头很好。我的问题是关于加载命令

我尝试注入以下段/命令:

  • __PAGEZERO
  • __文本
  • __文本,__文本
  • __链接编辑
  • LC_DYLD_INFO
  • LC_LOAD_DYLINKER
  • LC_MAIN
  • LC_LOAD_DYLIB

但是无论我尝试什么(我什至尝试从其他可执行文件复制它们的值,然后我“替换”了入口点的地址以匹配我的),我都找不到使我的可执行文件工作的方法。

有谁知道我需要注入可执行文件及其值的确切加载命令是什么?

PS:如果有一种不使用 dyld 的方法,我会更高兴(我打算坚持使用系统调用)

macos assembly mach-o arm64

4
推荐指数
1
解决办法
98
查看次数