我在本地有一个包含多个智能合约的项目,我想生成我的sc.sol智能合约的 ABI。我确实希望使用forge或在本地执行此操作foundry。我知道可以在 Remix 上做到这一点或使用 solc,但我没有这些并且希望仅使用 Foundry/forge。
我有一个C++类,它实现了二进制兼容接口(用作共享库),因此只返回C类型.字符串为const char*,void指针,以及指向具有二进制兼容接口的其他类的指针.问题是如何组织内存管理,我应该返回现有类数据的常量指针(用户使用过时指针的危险),并在那里释放内存,或者更确切地指向某些堆变量,并让用户负责删除这些指针以后还是??? 对此有一些一般性的指导方针吗?
我正在努力为clang编写一个快速而肮脏的demangler.我已经发现了一段代码使用abi::__cxa_demangle,但我想不出它需要哪些头.显而易见的选择是ABI.h但是:
demangle.cpp:2:10: fatal error: 'ABI.h' file not found
#include <ABI.h>
^
Run Code Online (Sandbox Code Playgroud)
我需要使用abi::__cxa_demangle什么?
我想在Linux上编译一个动态链接的可执行文件,我想要定位一个较旧的glibc ABI,以确保它可以在尽可能多的Linux计算机上运行.我知道对此的典型解决方案是使用chroot或虚拟机,安装旧的工具链,并让工具链自然地针对较旧的glibc ABI,但我想知道是否有办法明确告诉编译器"嘿,我希望你依赖版本GLIBCXX_3.4.11".
谢谢!
说我有这个库:
// lib.h
typedef struct MyStruct {
int a;
int b;
} MyStruct;
int func(void);
Run Code Online (Sandbox Code Playgroud)
这些函数都不使用MyStruct作为参数.是否可以在MyStruct不破坏ABI的情况下移除?
我正在尝试使用boost来构建单元测试,但链接器抱怨缺少函数.拿这个骨架代码
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(TestFuncOps);
BOOST_AUTO_TEST_CASE(CopyConstructor)
{
}
BOOST_AUTO_TEST_SUITE_END();
Run Code Online (Sandbox Code Playgroud)
但它失败了
Undefined symbols for architecture x86_64:
"boost::unit_test::ut_detail::normalize_test_case_name[abi:cxx11](boost::unit_test::basic_cstring<char const>)", referenced from:
__GLOBAL__sub_I_funcopstest.cc in funcopstest.o
Run Code Online (Sandbox Code Playgroud)
该libboost_unit_test_framework由我的链接器命令发现:
g++-5 --std=c++14 funcopstest.o -L/usr/local/lib -lboost_unit_test_framework -o test_funcops
Run Code Online (Sandbox Code Playgroud)
因为当拿走时-lboost_unit_test_framework,我得到了大量未定义的引用,而不是只有一个.Boost是brew使用c ++ 11模式从源代码安装的.我试图编译,-fabi-version=[0-8]但每次都没有改变.
有人知道发生了什么事吗?
import std.range : cycle;
void foo() pure @safe {
cycle([1, 2]);
}
Run Code Online (Sandbox Code Playgroud)
今天我遇到了用D语言编写的程序.我试图了解它的汇编代码,从一个简单的函数开始.
pure nothrow @nogc @safe std.range.Cycle!(int[]).Cycle std.range.cycle!(int[]).cycle(int[]):
push rbp
mov rbp,rsp
sub rsp,0x40
mov QWORD PTR [rbp-0x20],rdi
mov QWORD PTR [rbp-0x10],rsi
mov QWORD PTR [rbp-0x8],rdx
... rest of the function
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几次读它,但无法理解为什么
std.range.cycle()得到3个参数(RDI,RSI和RDX),或者我的范围是([1, 2]).它不是一个类似C的结构?
或者我错过了什么?
wint_t使用默认情况下已在编译器中定义的事实,在wchar.hvia 内设置type .所以要改变stddef.h__WINT_TYPE__
typedef unsigned int wint_t;
Run Code Online (Sandbox Code Playgroud)
成
typedef wchar_t wint_t;
Run Code Online (Sandbox Code Playgroud)
我们可以在开头使用以下代码 wchar.h
#undef __WINT_TYPE__
#define __WINT_TYPE__ wchar_t
#define WEOF (-1)
Run Code Online (Sandbox Code Playgroud)
但是这条评论表明这样做"打破了C++重写的兼容性".
您不能在不破坏ABI兼容性的情况下更改typedef的现有定义(例如wint_t)(即使您具有相同的大小和签名,因此C语言与ABI兼容,更改C++重整的基础类型中断兼容性).
那么,为什么这个typedef无法改变,什么是"兼容C++ mangling"?
我有一个使用MIPSpro编译器在SGI 64位机器上生成的二进制对象.我试图在运行RHEL 6.7的64位x86_64机器上读取这个二进制对象.对象的结构就像是
class A {
public:
A(){
a_ = 1;
}
A(int a){
a_ = a;
}
virtual ~A();
protected:
int a_;
};
class B : public A {
public:
// Constructors, methods, etc
B(double b, int a){
b_ = b;
a_ = a;
}
virtual ~B();
private:
double b_;
};
A::~A(){}
B::~B(){}
Run Code Online (Sandbox Code Playgroud)
读取二进制文件后,交换字节(由于字节顺序),我发现它b是正确的但未a对齐,表明数据与我当前的构建不对齐.
我有两个问题.首先,MIPS Pro编译器如何调整其字段以及gcc它的方式有何不同.我对继承类的情况感兴趣.其次,是否有一个选项gcc或C++可以强制对齐与MIPS的方式相同?
更新1:为了进一步说明,代码是在MIPS ABI n64上编译的.我可以访问原始的C++源代码,但我不能在MIPS机器上更改它.我被限制在x86_64上读取二进制文件.
更新2:我virtual在两台机器上的两个类中添加析构函数之前和之后运行了sizeof命令.
在MIPS和x86_64上,虚拟指令之前的输出是
size of class A: 4
size …Run Code Online (Sandbox Code Playgroud) 这里这个问题表明,std::atomic<T>被普遍认为有大小相同T,而事实上,这似乎是对GCC,铛,和MSVC在x86,x64和ARM的情况。
在std::atomic<T>某个类型始终无锁的实现中T,是否保证其内存布局与的内存布局相同T?是否还有其他特殊要求std::atomic,例如对齐?