标签: abi

如何使用 Foundry/forge 在本地生成智能合约的 ABI?

我在本地有一个包含多个智能合约的项目,我想生成我的sc.sol智能合约的 ABI。我确实希望使用forge或在本地执行此操作foundry。我知道可以在 Remix 上做到这一点或使用 solc,但我没有这些并且希望仅使用 Foundry/forge。

abi solidity smartcontracts foundry-forge

5
推荐指数
1
解决办法
1315
查看次数

从类中返回指针.谁负责删除?

我有一个C++类,它实现了二进制兼容接口(用作共享库),因此只返回C类型.字符串为const char*,void指针,以及指向具有二进制兼容接口的其他类的指针.问题是如何组织内存管理,我应该返回现有类数据的常量指针(用户使用过时指针的危险),并在那里释放内存,或者更确切地指向某些堆变量,并让用户负责删除这些指针以后还是??? 对此有一些一般性的指导方针吗?

c c++ abi

4
推荐指数
1
解决办法
290
查看次数

如何在clang(或gcc)中解码C++名称?

我正在努力为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什么?

c++ gcc abi clang

4
推荐指数
1
解决办法
4205
查看次数

针对特定的glibc ABI

我想在Linux上编译一个动态链接的可执行文件,我想要定位一个较旧的glibc ABI,以确保它可以在尽可能多的Linux计算机上运行.我知道对此的典型解决方案是使用chroot或虚拟机,安装旧的工具链,并让工具链自然地针对较旧的glibc ABI,但我想知道是否有办法明确告诉编译器"嘿,我希望你依赖版本GLIBCXX_3.4.11".

谢谢!

linux gcc glibc abi

4
推荐指数
1
解决办法
519
查看次数

删除结构是否构成ABI中断?

说我有这个库:

// lib.h
typedef struct MyStruct {
    int a;
    int b;
} MyStruct;

int func(void);
Run Code Online (Sandbox Code Playgroud)

这些函数都不使用MyStruct作为参数.是否可以在MyStruct不破坏ABI的情况下移除?

c abi

4
推荐指数
1
解决办法
104
查看次数

提升单元测试链接错误 - 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]但每次都没有改变.

有人知道发生了什么事吗?

c++ linker boost unit-testing abi

4
推荐指数
1
解决办法
2356
查看次数

Dlang - 在装配中低估std.cycle()

import std.range : cycle;
void foo() pure @safe {
    cycle([1, 2]);
}
Run Code Online (Sandbox Code Playgroud)

今天我遇到了用D语言编写的程序.我试图了解它的汇编代码,从一个简单的函数开始.

D编译器资源管理器上的asm输出:

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,RSIRDX),或者我的范围是([1, 2]).它不是一个类似C的结构?

或者我错过了什么?

assembly d x86-64 std abi

4
推荐指数
1
解决办法
134
查看次数

什么是"C++ mangling的兼容性"?

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"?

另请参阅此问题如何更改wchar.h以使wchar_t与wint_t的类型相同?

c c++ compatibility glibc abi

4
推荐指数
1
解决办法
320
查看次数

MIPS和x86_64之间对象对齐的差异

我有一个使用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)

c++ x86-64 mips abi

4
推荐指数
1
解决办法
225
查看次数

如果`atomic &lt;T&gt;`是无锁的,并且大小与`T`相同,那么内存布局是否相同?

这里这个问题表明,std::atomic<T>普遍认为有大小相同T,而事实上,这似乎是对GCC,铛,和MSVC在x86,x64和ARM的情况。

std::atomic<T>某个类型始终无锁的实现中T,是否保证其内存布局与的内存布局相同T?是否还有其他特殊要求std::atomic,例如对齐?

c++ atomic abi memory-layout c++11

4
推荐指数
1
解决办法
82
查看次数