标签: mach-o

Swift:__attribute的宏__((section))

这是一个奇怪的,非Swift-thonic的问题,所以请耐心等待.
我想在Swift中做类似于我目前在Objective-C/C++中所做的事情,所以我将从描述它开始.

我有一些现有的C++代码定义了一个宏,当在代码中的任何地方使用表达式时,它会在编译时将一个条目插入到二进制文件的表中.换句话说,用户写这样的东西:

#include "magic.h"

void foo(bool b) {
    if (b) {
        printf("%d\n", MAGIC(xyzzy));
    }
}
Run Code Online (Sandbox Code Playgroud)

并感谢定义

#define MAGIC(Name) \
  []{ static int __attribute__((used, section("DATA,magical"))) Name; return Name; }()
Run Code Online (Sandbox Code Playgroud)

在编译时实际发生的是创建一个名为(modulo name-mangling)的静态变量xyzzy并将其分配到magical我的Mach-O二进制文件的特殊部分中,因此运行nm -m foo.o转储符号会显示如下内容:

0000000000000098 (__TEXT,__eh_frame) non-external EH_frame0
0000000000000050 (__TEXT,__cstring) non-external L_.str
0000000000000000 (__TEXT,__text) external __Z3foob
00000000000000b0 (__TEXT,__eh_frame) external __Z3foob.eh
0000000000000040 (__TEXT,__text) non-external __ZZ3foobENK3$_0clEv
00000000000000d8 (__TEXT,__eh_frame) non-external __ZZ3foobENK3$_0clEv.eh
0000000000000054 (__DATA,magical) non-external [no dead strip] __ZZZ3foobENK3$_0clEvE5xyzzy
                 (undefined) external _printf
Run Code Online (Sandbox Code Playgroud)

通过魔术getsectbynamefromheader() …

metaprogramming mach-o swift swift2

23
推荐指数
1
解决办法
795
查看次数

确定编译二进制文件的最小OSX版本

当使用Clang或GCC的Darwin后端为OSX创建可执行文件时,该标志-mmacosx-version-min=version可用于设置可执行文件将运行的最早版本的OSX.

有没有办法从给定的可执行文件中追溯哪个标志用于编译它?即有没有办法确定给定可执行文件的目标最小OSX版本?

macos mach-o toolchain

22
推荐指数
3
解决办法
5380
查看次数

mach-o 文件,但不兼容的架构有“x86_64”,需要“arm64e”M1 MAC

from PyQt6.QtWidgets import *

from model.Department import Department
from view.main_window import Ui_Form
from model.Department import Department, Employee

class Homewidget(QWidget,Ui_Form):

    def __init__(self):
        QWidget.__init___(self)
        self.setupUi(self)

        self.depts = Department.get_all_depts()
        self.load_depts

        self.emps= Employee.get_all_emps()
        self.load_emps

        self.cb_depts.currentIndexChanged.connect(self.filter_emps_by_dept)
        self.le_search.textChanged.connect(self.filter_emps_by_name)


    def load_depts(self):
        names = [d.dept_name for d in self.depts]
        self.cb_depts.addItems(names)
    def load_emps(self):
        self.tb_emps.setRowCount(0)
        for i, e in self.emps:
            self.tb_emps.insertRow(i)
            for j, info in enumerate(e.__dict__.values()):
                self.tb_emps.setItem(i , j, QTableWidgetItem(str(info)))

    def filter_emps_by_dept(self, idx):
                    self.load_emps()
                    if idx != 0:
                        dept = self.depts[idx - 1]
                        for i, e in enumerate(self.emps):
                            if e.dept_id …
Run Code Online (Sandbox Code Playgroud)

python mach-o arm64 apple-m1 pyqt6

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

为什么静态内联数据成员不会出现在 Macos 上的 .bss 部分?

Macos上尝试snmalloc 我想知道为什么所有创建的二进制文件都是 >256MiB

事实证明,static inline在 Mac OS X 上,ARM64 和 x86_64 上的零初始化数据成员以一种奇怪的方式降低。即使这个简单的测试也会产生巨大的二进制文件:

容器.h

#pragma once
#include <cstdint>

class Container {
    public:
        inline static uint8_t inner[256000000];
};
Run Code Online (Sandbox Code Playgroud)

主文件

#include "container.h"

int main() {
    return Container::inner[0];
}
Run Code Online (Sandbox Code Playgroud)

编译成这样:

$ ~/clang+llvm-12.0.0-x86_64-apple-darwin/bin/clang -O3 -std=c++17 main.cc --target=x86_64-apple-darwin -c; ls -l main.o
-rw-r--r--  1 hans  staff  256000744 Jun 21 16:29 main.o
Run Code Online (Sandbox Code Playgroud)

开源 clang 和 Apple clang 一样。gcc 的行为类似。

在 Linux(用 clang 或 gcc 编译)上,它包含在 .bss 部分中,因此不占用任何空间。

为什么在 Macos 上会出现这种情况?这是错误还是预期行为?

c++ macos mach-o llvm clang

17
推荐指数
2
解决办法
398
查看次数

@loader_path解决了什么路径?

我很难理解文件中的绝对路径@loader_path.

user@local:~$ otool -L zlib.so 
zlib.so:
    @loader_path/../../libz.1.dylib (compatibility version 1.0.0, current version 1.2.7)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
Run Code Online (Sandbox Code Playgroud)

我想知道系统在哪里找到libz.1.dylib.

从一些Mac文档:

@ loader_path /此变量替换为包含mach-o二进制文件的目录的路径,该二进制文件包含使用@loader_path的load命令.因此,在每个二进制文件中,@ download_path解析为不同的路径

我猜想这意味着@loader_path只是目标文件(zlib.so)的路径,但这似乎不是真的.

是否有任何命令行实用程序将@loader_path解析为尝试打开库时使用的实际路径?

macos mach-o shared-libraries otool dyld

15
推荐指数
1
解决办法
1万
查看次数

Apple Mach-O链接器(Id)错误

第一次遇到这个错误,我环顾四周,无法找到帮助我的解决方案,我已经清理了我的构建并检查以确保我正在编译最新的固件.

这发生在我累了实现我在这里找到的可达性解决方案后, 我导入了两个可达性文件(.m/.h),然后将此代码添加到.m文件中,并在该文件中延迟了.h可达性文件

-(BOOL)reachable {
    Reachability*r =[Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus =[r currentReachabilityStatus];
    if(internetStatus ==NotReachable){
        return NO;
    }
    return YES;}
Run Code Online (Sandbox Code Playgroud)

之后我从我的两个viwcontrollers viewwillappear方法中调用了这个函数,就像这样.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];


    //-- Check Reachability START ---->
    Reachability *reach = [[Reachability alloc] init];

    if ([reach reachable]) {
            NSLog(@"Reachable");
    }
    else {
        NSLog(@"Not Reachable");
    }
     //-- Check Reachability END ---->
}
Run Code Online (Sandbox Code Playgroud)

没有错误产生,直到我试图在模拟器中构建和运行.这是我收到的错误:(

Ld /Users/imac/Library/Developer/Xcode/DerivedData/wizcode-ccyrqptvfsabmbahgxartbvxwurq/Build/Products/Debug-iphonesimulator/wizcode.app/wizcode normal i386 cd"/ Users/imac/Documents/Iphone applications/wizsanCode/wizsanCode.5/wizcode"setenv MACOSX_DEPLOYMENT_TARGET 10.6 setenv PATH"/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"

/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/imac/Library/Developer/Xcode/DerivedData/wizcode-ccyrqptvfsabmbahgxartbvxwurq/Build/Products/Debug-iphonesimulator -F/Users/imac/Library/Developer/Xcode/DerivedData/wizcode-ccyrqptvfsabmbahgxartbvxwurq/Build/Products/Debug-iphonesimulator -filelist/Users/imac/Library/Developer/Xcode/DerivedData/wizcode-ccyrqptvfsabmbahgxartbvxwurq/Build/Intermediates/wizcode.build/Debug-iphonesimulator/wizcode.build/Objects-normal/i386/wizcode.LinkFileList -mmacosx-version-min = 10.6 …

iphone linker mach-o ios

12
推荐指数
1
解决办法
6万
查看次数

Linux Mach-O反汇编程序

是否有任何Linux程序可以反汇编OSX通用x86/x86_64脂肪Mach-O二进制文件,如objdump?GNU binutils的objdump支持ELF和Windows PE文件,但不支持Mach-O.

linux mach-o objdump disassembly

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

如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件或将静态库加入现有二进制文件(IOS)

这是我第一次询问stackoverflow,我很绝望.

我的任务是加载一个dylib或将静态库加入到IOS设备的现有可执行文件中.

我将使用它static void __attribute__((constructor)) initialize(void)开始调配.这个可执行文件适用于内部企业appstore,所以我不需要通过苹果appstore(因为他们会拒绝它).

这样做的原因是从客户及其签名密钥获取现有IPA,并为其应用程序添加新功能,而无需开发人员干预.

有一家公司正在做这个叫做nukona.您可以在此处观看电影:https://www.youtube.com/watch?feature = player_embedded&v = z9rrOB6lOxY

我可以告诉你,我试图将LSEnvironment放在plist文件中DYLD_INSERT_LIBRARIES但是事实证明LSEnvironment似乎对IOS应用程序的沙箱没有任何影响.

我还尝试使用install_name_tool来更改其中一个依赖项,并将其替换为我的dylib(也具有该依赖项).它没有信息崩溃原因.

显然,如果我将dylib添加到XCode中的测试应用程序并重新编译它是完美的,这是给定的.但是,这是我不能要求的,例如,公司的管理员.重建可能会阻止客户使用此库.

这是我在堆栈溢出时发现的相关链接,但对于osx,我需要它用于IOS. 如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件(OSX)

我唯一可以想到的是编辑二进制加载命令一些如何,但我不知道如何以及如何做到这一点考虑到重定位表等...

欢迎任何替代方案.

感谢您的时间.

mach-o dynamic-linking static-linking ios

12
推荐指数
1
解决办法
4170
查看次数

Apple Mach-O链接器(id)错误 - 架构i386的未定义符号

我知道此类错误之前已多次提出,但我没有找到我的错误的解决方案.我正在使用xcode 4.0.我下载了ASIHTTPRequest zip和复制的classes文件夹以及两个'Reachability'文件.编译后,它给了我奇怪的错误,这是我无法弄清楚的.下面我为架构i386复制了未定义符号的错误文本.

Ld /Users/svp/Library/Developer/Xcode/DerivedData/Manual_BeforePres2-fahkeiivemkgpubswgvzglvndszw/Build/Products/Debug-iphonesimulator/Manual.app/Manual normal i386
cd "/Users/svp/Desktop/Manual nav before pres 2"
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/svp/Library/Developer/Xcode/DerivedData/Manual_BeforePres2-fahkeiivemkgpubswgvzglvndszw/Build/Products/Debug-iphonesimulator -F/Users/svp/Library/Developer/Xcode/DerivedData/Manual_BeforePres2-fahkeiivemkgpubswgvzglvndszw/Build/Products/Debug-iphonesimulator -filelist /Users/svp/Library/Developer/Xcode/DerivedData/Manual_BeforePres2-fahkeiivemkgpubswgvzglvndszw/Build/Intermediates/Manual_BeforePres2.build/Debug-iphonesimulator/Manual.build/Objects-normal/i386/Manual.LinkFileList -mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -lz -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/svp/Library/Developer/Xcode/DerivedData/Manual_BeforePres2-fahkeiivemkgpubswgvzglvndszw/Build/Products/Debug-iphonesimulator/Manual.app/Manual

 Undefined symbols for architecture i386:
"_UTTypeCreatePreferredIdentifierForTag", referenced from:
  +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
"_UTTypeCopyPreferredTagWithClass", referenced from:
  +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
"_kUTTagClassFilenameExtension", referenced from:
  +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
"_kUTTagClassMIMEType", referenced from:
  +[ASIHTTPRequest mimeTypeForFileAtPath:] in ASIHTTPRequest.o
ld: …
Run Code Online (Sandbox Code Playgroud)

linker mach-o objective-c asihttprequest ios4

12
推荐指数
1
解决办法
1万
查看次数

如何将数据嵌入到Mac OS X mach-o二进制文件的TEXT部分?

我有一个Mac OS X命令行工具,可以从二进制文件本身嵌入一些数据中受益.

我知道mach-o文件支持多个段,其中一些段可用于存储任意数据.但我找不到一个命令行工具来做到这一点.

虽然我知道还有其他的,可能更简单的方法(例如将数据文件转换为C源代码并通过gcc链接)以将数据输入到我的二进制文件中,这个问题引起了我的兴趣.谁知道魔术?

macos linker mach-o

11
推荐指数
1
解决办法
2034
查看次数