Articles of abi

amd64 psABI在哪里?

AMD64 psABI曾经被x86-64.org托pipe。 我有一个pdf文件的副本,它明确地说: 体系结构规范可在网站http://www.x86-64.org/documentation上find 。 但http://www.x86-64.org已经很长一段时间了。 至less几个月。 有谁知道最新的PSABI可以从哪里拿走?

ARM上TLS的代码序列

线程本地存储文档的ELF处理为各种体系结构提供了各种模型(本地执行/初始执行/通用dynamic)的汇编序列。 但不是ARM – 有没有我能看到这样的ARM代码序列的地方? 我正在编译器,并希望生成代码将与平台链接器(包括程序和dynamic)正常运行。 为了清楚起见,我们假设一个ARMv7 CPU和一个相当新的内核和glibc(比如说3.13+ / 2.19+),但是如果这很容易解释的话,我也会对旧的硬件/软件有什么改变感兴趣。

arm版本之间的区别?(仅适用于ARMv7)

基本上我想知道ARMv7l和ARMv7之间的区别吗? 我得到了armv7l的arm处理器,armv7 hl有很多rpm。 我不完全知道我必须search以获取有关信息。 这个叫“后缀”是什么? 还有其他types吗? 他们有什么不同?

每个cpu arch真正的ELF TLS ABI要求是什么?

Ulrich Drepper关于线程本地存储的论文概述了几种不同cpu体系结构的TLS ABI,但是我发现它不足以作为实现TLS的基础,原因有两个: 它省略了一些重要的拱形,如ARM,MIPS等(包括一堆完全无关的Itanium) 更重要的是,它将大量的实现细节与ABI混合在一起,所以很难说出哪些属性是互操作性所必需的,哪些是他实现的方面。 例如,i386的唯一实际ABI要求是: %gs:0指向自己的指针。 主要可执行文件的TLS段(如果有)必须位于固定的(通过链接器,负数)偏移量的地址。 初始加载的库的所有其他TLS段必须具有相对于此地址的运行时常量(即对于每个线程都是相同的,但在不同的程序运行中不一定是相同的)偏移量(并且dynamic链接程序必须能够填充重定位这些抵消)。 ___tls_get_addr和__tls_get_addr函数必须以正确的语义存在以查找任意TLS段。 特别是数字电视的存在或布局不是 ABI的一部分,也不是主节目以外的TLS部分的sorting/布局。 看起来,使用“TLS变体II”的任何拱都具有大致上述的ABI要求。 但我完全不了解“TLS变体I”的要求,而且从阅读来源(在uClibc和glibc中)看来甚至可能有几个变体“变体I”。 有没有更好的文件可以帮助我,或者熟悉TLS的人可以向我解释ABI的要求吗?

如何避免二进制文件中的STT_GNU_IFUNC符号?

我需要部署到一个红帽4.1.2框(其中有gcc 4.1.2)。 我在Ubuntu 11.10上使用GCC 4.6.1进行开发。 不幸的是我的构build过程创build的一些二进制文件在RedHat机器上不可用。 原因似乎是一个ABI更改,根据另一个Stackoverflow问题导致STT_GNU_IFUNC符号的引入。 有没有办法阻止导出任何这样的符号,以便我的二进制文件可以使用旧的ABI? 我使用nm在我的二进制文件中查找任何“我”types的符号,但没有find。 我问这是因为我的一些其他二进制文件以及一些第三方库(tbb,boost)没有使用新的ABI,因此在RedHat机器上运行良好。 希望是明确的。 提前致谢。

C运行时对象,dll边界

deviseC API的最佳方法是处理传递与C运行时相关的“对象”(FILE *,由malloc返回的指针等)的问题。 例如,如果两个DLL与不同版本的运行时间链接,我的理解是,您不能安全地将一个DLL从一个DLL传递给另一个DLL。 是唯一的解决scheme使用Windows相关的API(这是保证在DLL工作)? C API已经存在,并且已经成熟,但是主要是由unixdevise的(当然还是要在unix上工作)。

x86 Linux与Windows?

我正在寻找一本更加面向Windows的x86书籍(本书是一个非常出色的书籍,Irvine,x86处理器的汇编语言)。 我不想学习Windows特有的信息,只是各种指令是什么? 这本书似乎是最好的解释它 – 只是它不针对Linux(我开发)。 我会没事,因为x86和Windows上的指令是相同的,只是一些调用约定可能会不同呢? build议最受欢迎

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么情况?

Linux上的int 0x80总是调用32位ABI,而不pipe它是从哪个模式调用的:args in ebx , ecx ,…和/usr/include/asm/unistd_32.h系统调用号。 (或在没有CONFIG_IA32_EMULATION情况下编译的64位内核崩溃)。 64位代码应该使用syscall ,来自/usr/include/asm/unistd_64.h调用编号以及rdi , rsi等中的参数。请参阅x86-64上的UNIX和Linux系统调用的调用约定是什么 。 如果您的问题被标记为重复的, 请参阅该链接了解如何以32位或64位代码进行系统调用。 如果你想了解究竟发生了什么,请继续阅读。 syscall系统调用比int 0x80系统调用要快,因此除非要编写多边形机器代码,而是在32位或64位执行时运行,否则请使用本机64位syscall 。 ( sysenter始终以32位模式返回,所以从64位用户空间无用,尽pipe它是有效的x86-64指令。) 使用int 0x80可以编写以32位或64位模式组装的东西,所以在microbenchmark之后的exit_group()方便使用。 当前正式的i386和x86-64 System V的PDF文件,psABI文档标准化的函数和系统调用约定从https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI链接。 有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅x86标记wiki。 但是,由于人们不断地用64位代码中使用int 0x80代码发布问题,或者意外地从32位源代码 构build了64位二进制代码,我不知道现在的Linux 究竟发生了什么? int 0x80保存/恢复所有的64位寄存器? 它是否截断任何寄存器到32位? 如果你传递了非零上半部分的指针参数,会发生什么? 如果你通过它的32位指针是否工作?

x86-64 System V ABI在哪里logging?

x86-64 System V ABI(用于Windows以外的所有应用程序)曾用于生存在http://x86-64.org/documentation/abi.pdf ,但是该网站现在已经从互联网上掉下来了。 这个文件是否有一个新的权威之家?

什么是x86_64 va_list结构的格式?

任何人都可以参考x86_64 ABI(在Linux上使用的)中的va_list的表示? 我试图debugging一些代码堆栈或参数似乎损坏,这将有助于了解我应该看到什么…