草庐IT

linux - 必须重新编译什么才能运行 x32 ABI 应用程序?

我可以使用新的x32ABI编译应用程序,然后在普通内核中运行它吗?运行时C库呢?预编译的x86/x86_64库是否有任何形式的互操作性? 最佳答案 没有。x32需要自己的一组库,就像x86和x86-64一样。就像您无法在仅提供x86-64库的系统上运行x86二进制文件一样,x32二进制文件也无法在仅提供x86和/或x86-64库的系统上运行。与x86和x86-64一样,x32是它自己的体系结构。当然,还必须在内核中启用支持。在未启用x32支持的情况下构建的内核将无法运行x32二进制文件。

linux - 针对特定的 glibc ABI

我想在Linux上编译一个动态链接的可执行文件,我想以较旧的glibcABI为目标,以确保它可以在尽可能多的linux计算机上运行。我知道对此的典型解决方案是使用chroot或虚拟机,安装旧工具链,并让工具链自然地针对旧glibcABI,但我想知道是否有办法明确告诉编译器“嘿,我希望您依赖版本GLIBCXX_3.4.11”。谢谢! 最佳答案 Hey,IwantyoutodependonversionGLIBCXX_3.4.11请注意,GLIBCXX是关于libstdc++的,不是glibc。当您将程序链接到libstdc++.so并

linux - 针对特定的 glibc ABI

我想在Linux上编译一个动态链接的可执行文件,我想以较旧的glibcABI为目标,以确保它可以在尽可能多的linux计算机上运行。我知道对此的典型解决方案是使用chroot或虚拟机,安装旧工具链,并让工具链自然地针对旧glibcABI,但我想知道是否有办法明确告诉编译器“嘿,我希望您依赖版本GLIBCXX_3.4.11”。谢谢! 最佳答案 Hey,IwantyoutodependonversionGLIBCXX_3.4.11请注意,GLIBCXX是关于libstdc++的,不是glibc。当您将程序链接到libstdc++.so并

没有 libstdc++ 的 C++ RTTI。可能吗?

我想研究如何在没有libstdc++但支持rtti的情况下链接C++程序。我尝试按照下面描述的方式编译它。我可以在示例中定义任何必要但不存在的符号,如函数strcmp,但是是否可以在没有显式mangle/demangle魔法的情况下定义typeinfo符号?如果可能的话,怎么做?cd/tmp&&catrtti.cpp&&g++-nodefaultlibs-lcrtti.cppextern"C"intstrcmp(constchar*s1,constchar*s2){return0;};#include"typeinfo"intmain(){returntypeid(int)==type

没有 libstdc++ 的 C++ RTTI。可能吗?

我想研究如何在没有libstdc++但支持rtti的情况下链接C++程序。我尝试按照下面描述的方式编译它。我可以在示例中定义任何必要但不存在的符号,如函数strcmp,但是是否可以在没有显式mangle/demangle魔法的情况下定义typeinfo符号?如果可能的话,怎么做?cd/tmp&&catrtti.cpp&&g++-nodefaultlibs-lcrtti.cppextern"C"intstrcmp(constchar*s1,constchar*s2){return0;};#include"typeinfo"intmain(){returntypeid(int)==type

linux - ARM 上 TLS 的代码序列

ELFHandlingForThread-LocalStorage文档给出了各种体系结构的各种模型(本地执行/初始执行/一般动态)的汇编序列。但不是ARM——在任何地方我都可以看到这样的ARM代码序列吗?我正在开发一个编译器,并希望生成能够与平台链接器(程序链接器和动态链接器)一起正常运行的代码。为清楚起见,我们假设一个ARMv7CPU和一个相当新的内核和glibc(例如3.13+/2.19+),但如果这很容易解释的话,我也会对旧硬件/软件必须更改的内容感兴趣。 最佳答案 我不太明白你想要什么。然而,汇编程序序列(针对ARMv6+和

linux - ARM 上 TLS 的代码序列

ELFHandlingForThread-LocalStorage文档给出了各种体系结构的各种模型(本地执行/初始执行/一般动态)的汇编序列。但不是ARM——在任何地方我都可以看到这样的ARM代码序列吗?我正在开发一个编译器,并希望生成能够与平台链接器(程序链接器和动态链接器)一起正常运行的代码。为清楚起见,我们假设一个ARMv7CPU和一个相当新的内核和glibc(例如3.13+/2.19+),但如果这很容易解释的话,我也会对旧硬件/软件必须更改的内容感兴趣。 最佳答案 我不太明白你想要什么。然而,汇编程序序列(针对ARMv6+和

linux - 为什么 golang clone syscall abi 与 x86-64 上的 linux 内核克隆不同

在glibc/sysdeps/unix/sysv/linux/x86_64/clone.S的linux内核克隆abi定义:Thekernelexpects:rax:systemcallnumberrdi:flagsrsi:child_stackrdx:TIDfieldinparentr10:TIDfieldinchildr8:threadpointer在go1.11.5/src/runtime/sys_linux_amd64.s的golang克隆系统调用://int32clone(int32flags,void*stk,M*mp,G*gp,void(*fn)(void));TEXTru

linux - 为什么 golang clone syscall abi 与 x86-64 上的 linux 内核克隆不同

在glibc/sysdeps/unix/sysv/linux/x86_64/clone.S的linux内核克隆abi定义:Thekernelexpects:rax:systemcallnumberrdi:flagsrsi:child_stackrdx:TIDfieldinparentr10:TIDfieldinchildr8:threadpointer在go1.11.5/src/runtime/sys_linux_amd64.s的golang克隆系统调用://int32clone(int32flags,void*stk,M*mp,G*gp,void(*fn)(void));TEXTru

linux - 哪些 <4GB 的工作负载在 Linux x32 ABI 中的性能会比 x64 差?

有一个比较newLinuxABIreferredtoasx32,其中x86-64处理器以32位模式运行,因此指针仍然只有32位,但仍然使用64位架构特定的寄存器。所以你仍然限制在正常32位中使用4GB最大内存,但是你的指针使用的缓存空间比在64位中少,你可以有效地进行64位算术,并且你可以访问更多寄存器(16)比普通32位(8)中的要多。假设您的工作负载正好适合4GB,x32的性能是否会比x86-64差?在我看来,如果您不需要额外的内存空间,则不会丢失任何东西——您应该始终获得相同的性能(当您已经适合缓存时)或更好(当指针空间节省让您适合更多时)在缓存中)。但如果有分页/TLB/等,我