我的系统:在 x86_64 上运行的 Ubuntu 22.04.3。海湾合作委员会版本 11.4.0
我读到 System V ABI 强制要求使用红色区域。来自海湾合作委员会手册:
红色区域是 x86-64 ABI 强制规定的,它是超出堆栈指针位置的 128 字节区域,不会被信号或中断处理程序修改,因此可用于临时数据而无需调整堆栈指针。该标志
-mno-red-zone禁用该红色区域。
我的问题:
如果我在 gcc 中使用该标志,红色区域是否仍然存在-mno-red-zone?
如果红色区域被“禁用”,这是否意味着我不再遵守系统 V ABI?
这会产生什么后果(不符合 System V ABI)?
如果我做对了,那应该不会那么难以思考.具体来说,我将从iOS和ELF可执行格式开始.让我们澄清一下,我有一个越狱的iPhone,我不想在任何appstore应用程序中这样做,所以请求避免"好的建议",如"你不能这样做,因为它被Apple禁止".
所以,我所看到的是有一个名为Frash的Flash播放器实现(由Comex btw,最近的越狱开发人员).安装后,此实用程序需要Android的libflashplayer.so存在(复制到)iPhone文件系统.我深入研究了源代码,发现调整实际上打开了Android(ELF)共享对象文件,"解析"它并从中执行代码.我已经问过我的一个朋友,它实际上是不可能的,他告诉我它是,因为ARM上的ELF和ARM上的Mach-O是二进制兼容的(因为它们都是ARM).但他实际上没有向我详细解释,所以我想问一下怎么办呢?我无法完全理解处理的源代码片段,但有一件事是肯定的:
int fd = open("libflashplayer.so", O_RDONLY);
_assert(fd > 0);
fds_init();
sandbox_me();
int symtab_size;
Elf32_Sym *symtab;
void **init_array;
Elf32_Word init_array_size;
char *strtab;
TIME(base_load_elf(fd, &symtab, &symtab_size, &init_array, &init_array_size, &strtab));
// Call the init funcs
_assert(init_array);
while(init_array_size >= 4) {
void (*x)() = *init_array++;
notice("Calling %p", x);
x();
init_array_size -= 4;
}
Run Code Online (Sandbox Code Playgroud)
(来自原始代码,截至2011年12月2日在GitHub上)
在我看来他用libelf来执行此操作,对吗?在ELF文件中有符号可以在兼容的处理器上执行就好了吗?
我还想知道所有其他处理器架构是否都适用?那么也许可以在OS X上从Linux二进制文件执行符号?
我正在开发Android应用程序,因为我正在开发NDK.在编译文件时,我得到了所选处理器的错误,不支持`qadd16 r1,r1,r0'.任何人都可以解释我为什么以及在哪里出现此错误以及如何处理此错误?这是我的basic_op.h文件的代码片段
static inline Word32 L_add(register Word32 ra, register Word32 rb)
{
Word32 out;
__asm__("qadd %0, %1, %2"
: "=r"(out)
: "r"(ra), "r"(rb));
return (out);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢
我需要确定用于生成一些二进制文件、程序、动态和静态库的 ABI。
我想问一下是否有一个属性、一个标签或一个字符串,我可以用一些外部工具检查以查看哪个 ABI 用于创建该二进制对象。我的对象主要是用于 x86 和 ARM 的 ELF,我也包括用于调试目的的 ABI,例如 DWARF 对象。
编辑:类似于文件开头的魔术字节,通常用于检测文件的文件格式。
我正在尝试在 Linux 上用 C++挂钩recv()和send()函数。
我知道如何挂钩函数 (github: zeek/subhook)。但是我想要一些帮助来学习如何查找recv()或send()函数的地址(在运行时,或使用独立于版本的解决方案)。
我愿意接受任何可以帮助我理解此处涉及的机制的文档或建议。
[编辑] 澄清:我不想使用,LD_PRELOAD=因为我用这个工具注入了我的共享库:linux-inject。
这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.
我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.
然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.
有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?
这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.
在x86_64/Linux上,使用gcc/clang -O3编译:
void void_unspec0(),void_unspec1(),void_unspec2(),void_unspec3(),void_void(void);
void call_void_void()
{
void_void();
void_void();
void_void();
void_void();
void_void();
}
void call_void_unspec()
{
void_unspec0();
void_unspec0();
void_unspec0();
void_unspec0();
void_unspec1(.0,.0,.0);
void_unspec2(.0,.0,.0,.0,.0,.0,.0,.0);
void_unspec3(.0,.0,.0,.0,.0,.0,.0,.0,.0,.0);
}
Run Code Online (Sandbox Code Playgroud)
拆解为:
0000000000000000 <call_void_void>:
0: 48 83 ec 08 sub $0x8,%rsp
4: e8 00 00 00 00 callq 9 <call_void_void+0x9>
9: e8 00 00 00 00 callq e <call_void_void+0xe>
e: e8 00 00 00 00 callq 13 <call_void_void+0x13>
13: e8 00 00 00 00 callq 18 <call_void_void+0x18>
18: 48 83 c4 08 add $0x8,%rsp
1c: e9 00 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Flutter 中构建一个文件大小较小的发布应用程序。昨天发布的 apk 大小约为 16mb,但在我更新 flutter 后,大小变为 23mb。
经过一番研究,我发现 flutter 生成了包含所有 ABI 的应用程序包,并且在更新后,新的 API 已添加到 apk。
将应用程序添加到 android studio apk 分析器后,我可以看到其中的不同 ABI,如下所示:
x86_64 7.1mb
arm64-v8a 7mb
armeabi-v7a 6.8mb
Run Code Online (Sandbox Code Playgroud)
我可以用来flutter build apk --split-per-abi为不同的 ABI 生成 apk。现在的问题是,arm64-v8a系统可以运行x86_64apk吗?(或其他)。或者这些 ABI apk 版本中的任何一个都可以在所有设备中运行吗?
我不会在应用程序商店上发布我的应用程序,我只是将它放在我客户的网站上,他们的客户将从那里下载它(或者它会通过电子邮件发送给他们,......)。所以我需要一个适用于所有 android 设备的版本,而完整的捆绑版本太大了(23mb)。
编辑:
我刚刚x86_64在arm64-v8a设备上测试了构建,但没有安装。但armeabi-v7a版本确实安装了。
考虑这个简单的函数:
struct Foo {
int a;
int b;
int c;
int d;
int e;
int f;
};
Foo foo() {
Foo f;
f.a = 1;
f.b = 2;
f.c = 3;
f.d = 4;
f.e = 5;
f.f = 6;
return f;
}
Run Code Online (Sandbox Code Playgroud)
它生成以下程序集:
0000000000400500 <foo()>:
400500: 48 ba 01 00 00 00 02 movabs rdx,0x200000001
400507: 00 00 00
40050a: 48 b9 03 00 00 00 04 movabs rcx,0x400000003
400511: 00 00 00
400514: 48 be 05 00 00 …Run Code Online (Sandbox Code Playgroud)