这是一个奇怪的,非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() …
当使用Clang或GCC的Darwin后端为OSX创建可执行文件时,该标志-mmacosx-version-min=version可用于设置可执行文件将运行的最早版本的OSX.
有没有办法从给定的可执行文件中追溯哪个标志用于编译它?即有没有办法确定给定可执行文件的目标最小OSX版本?
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) 在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 上会出现这种情况?这是错误还是预期行为?
我很难理解文件中的绝对路径@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解析为尝试打开库时使用的实际路径?
第一次遇到这个错误,我环顾四周,无法找到帮助我的解决方案,我已经清理了我的构建并检查以确保我正在编译最新的固件.
这发生在我累了实现我在这里找到的可达性解决方案后, 我导入了两个可达性文件(.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 …
是否有任何Linux程序可以反汇编OSX通用x86/x86_64脂肪Mach-O二进制文件,如objdump?GNU binutils的objdump支持ELF和Windows PE文件,但不支持Mach-O.
这是我第一次询问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)
我唯一可以想到的是编辑二进制加载命令一些如何,但我不知道如何以及如何做到这一点考虑到重定位表等...
欢迎任何替代方案.
感谢您的时间.
我知道此类错误之前已多次提出,但我没有找到我的错误的解决方案.我正在使用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) 我有一个Mac OS X命令行工具,可以从二进制文件本身嵌入一些数据中受益.
我知道mach-o文件支持多个段,其中一些段可用于存储任意数据.但我找不到一个命令行工具来做到这一点.
虽然我知道还有其他的,可能更简单的方法(例如将数据文件转换为C源代码并通过gcc链接)以将数据输入到我的二进制文件中,这个问题引起了我的兴趣.谁知道魔术?