我了解到,您不能一起使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。当然例外的是如果你有一个纯C 接口,那么这是可能的。但是,我在这方面没有找到关于静态库的明确说明,因此提出这个问题。
我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期进行编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?
在 C 级别,建议通常通过指针传递大于字大小(x86-64 上为 8 字节)的任何内容,并通过值传递任何小于字大小的内容(意味着通过寄存器)。争论的焦点应该是传递 1 个指针值比传递 N 个成员更有效。但这似乎即使对于 N=2 也应该是正确的。那么为什么 ABI 只有在超过 16 个字节时才开始使用内存呢?为什么不是8?
按值传递 16 字节结构与 24 字节传递的代码生成差异示例: https: //godbolt.org/z/5WdjEEr4E
以 Boost 为例,boost::filesystem当 C++ 没有稳定的 ABI 时,为什么我能够从我的 C++ 程序进行链接。
我的系统中安装了 Boost,并且玩具程序能够使用 进行链接-lboost_filesystem,即使boost::filesystem公开了 C++ API(没有 extern 'C' )。
那么,是否可以创建可以被各种编译器版本链接的C++共享库呢?Boost 如何在没有“extern C”的情况下实现这一目标?
我试过:
#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main() {
// Replace "/path/to/directory" with the path to the directory you want to list
std::string directory_path = "/path/to/directory";
try {
// Check if the given path exists and is a directory
if (fs::exists(directory_path) && fs::is_directory(directory_path)) {
std::cout << "Listing files in directory: " …Run Code Online (Sandbox Code Playgroud) 如标题所述,如何在汇编语言中使用c库函数fgets?实际上,我想知道如何获取stdin的文件指针.感谢您的回复.
我在寻找替代的readelf和objdump二重奏使用Visual Studio编译C++源代码和调查时lib,obj和dll.
我知道MinGW提供了这个工具的移植,但我正在寻找官方支持Microsoft C++ ABI的东西.
如果这件事,我正在使用Visual Studio 2012.
谢谢.
我需要能够在Java中检测运行时设备的ABI(armeabi,armeabi-v7a,x86或mips).这可能吗 ?
的文档abi::__cxa_demangle(例如https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html)指定第二个参数char * output_buffer需加malloc-ed。
这意味着不允许在堆栈上分配如下所示的字符缓冲区。
enum {N = 256};
char output_buffer[N];
size_t output_length = 0;
int status = -4;
char * const result = std::__cxa_demangle(mangled_name,
output_buffer, &output_length, &status);
Run Code Online (Sandbox Code Playgroud)
两个问题:
为什么output_buffer不允许在堆栈上?
为什么已经传递输出缓冲区时返回不同的指针?
受backtrace()示例的影响,我会想到一个像以下的API
// Demangle the symbol in 'mangled_name' and store the output
// in 'output_buffer' where 'output_buffer' is a caller supplied
// buffer of length 'output_buffer_length'. The API returns the
// number of bytes written to 'output_buffer' which is …Run Code Online (Sandbox Code Playgroud) 9.1 C++
对于C++ ABI,我们将使用IA-64 C++ ABI并适当地实例化它.该ABI的当前草案可在以下网站获得:
为什么不设计自己的ABI?
我在这里阅读有关C语言中的结构填充的信息:http : //www.catb.org/esr/structure-packing/。
我不明白为什么在编译时为堆栈上分配的变量/结构确定的填充在所有情况下在语义上都是有效的。让我提供一个例子。假设我们要编译以下玩具代码:
int main() {
int a;
a = 1;
}
Run Code Online (Sandbox Code Playgroud)
在X86-64上gcc -S -O0 a.c生成此程序集(删除了不必要的符号):
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么我们知道4的值%rbp并因此%rbp-4是4对齐的,以适合于int的存储/加载?
让我们尝试使用结构相同的示例。
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $0, %eax
popq %rbp
ret
Run Code Online (Sandbox Code Playgroud)
从阅读中我推断出结构的填充版本看起来像这样:
struct st{
char a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
所以,第二个玩具的例子
struct st{
char a; // 1 byte
char …Run Code Online (Sandbox Code Playgroud)