标签: abi

为什么依赖应用程序应该使用与动态库相同的编译器?

最近我必须编译 Qt,并且说明明确提到我的应用程序应该使用与我编译 Qt 相同的编译器进行编译。现在我不明白其原因,想知道这是 Qt 特有的还是通用的 C++ 的东西?

c++ qt abi linkage

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

为什么“ARM 架构的过程调用标准”(AAPCS) 要求 SP 8 字节对齐?

由于这是一个反复出现的话题,所以我提出了一个关于它的问题。

根据AAPCS

5.2.1.1 通用堆栈约束

  • SP mod 4 = 0。堆栈必须始终与字边界对齐

5.2.1.2 公共接口的堆栈约束

  • SP mod 8 = 0。堆栈必须双字对齐。

8字节对齐背后的原理是什么?

assembly arm abi calling-convention stack-pointer

5
推荐指数
2
解决办法
2076
查看次数

内联命名空间可以用来保持共享库的向后兼容性吗?

C++ 内联命名空间的基本原理是源代码和二进制兼容性(请参阅N2535中链接的 Herb Sutter 的论文),但在引入内联命名空间时,或者如果可能的话,我无法找到保持现有库的二进制兼容性的好示例。

(有关更多信息以及源兼容性的示例,请参阅此问题

(为了解决相关问题,使用内联命名空间引入不兼容,请参阅这个问题

如果这是我们当前的库(例如 mylib.dll),与客户端共享并且需要稳定:

struct ModelA
{
   /* (...) lots of stuff */
};

struct ModelB
{
   /* (...) lots of stuff */
};
Run Code Online (Sandbox Code Playgroud)

我们是否可以使用内联命名空间引入新版本的结构/类而不破坏客户端(即仅替换共享库文件(mylib.dll),无需重新编译)?

inline namespace mylib
{

inline namespace v1
{
struct ModelA
{
   /* (...) lots of stuff */
};
} // end namespace v1

namespace v2
{
struct ModelA
{
   /* (...) lots of stuff + newstuff */
};
} // end namespace …
Run Code Online (Sandbox Code Playgroud)

c++ abi binary-compatibility c++11

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

Web3 JS 库(和 Metamask),获取代币余额

我想查询一个公钥的 eth 余额和所有代币余额。到目前为止,我设法加载web3并调用了该getBalance方法。

现在,我想查看使用相同公钥存储的 ERC20 代币的余额?例如我想查看OMG代币余额?

到目前为止我发现每个代币合约地址都要查询:https : //ethereum.stackexchange.com/questions/15372/how-can-i-view-all-the-tokens-and-contracts-related-with- an-ethereum-address

omgContractAddress = "0xd26114cd6EE289AccF82350c8d8487fedB8A0C07"
OmgContract = web3.eth.contract(abi)
omgContract = OmgContract.at(omgContractAddress)
someUsersAddress = "0x75087d9faa28d653750f3e4c86e7dcf6aff0a916"
omgContract.balanceOf someUsersAddress, (err, balance)-> #some owner
        console.error err
        console.info balance.toNumber()
Run Code Online (Sandbox Code Playgroud)

问题:

1) 我需要abi每个令牌的 吗?或者我可以使用标准化abi的 ERC20 代币,只要我只想使用标准化的方法吗?

2)我在哪里可以找到abi?还是我需要重新编译每个合同?

例如 OMG:https : //etherscan.io/token/OmiseGo

balance abi web3js

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

了解堆栈对齐强制执行

考虑以下 C 代码:

#include <stdint.h>

void func(void) {
   uint32_t var = 0;
   return;
}
Run Code Online (Sandbox Code Playgroud)

-O0GCC 4.7.2 为上述代码生成的未优化(即:选项)汇编代码是:

func:
    pushl %ebp
    movl %esp, %ebp
    subl $16, %esp
    movl $0, -4(%ebp)
    nop
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

根据堆栈对准要求所述的系统V ABI,堆栈必须由16个字节每之前对准call指令(该堆栈边界是默认的16个字节时不与该选项改变-mpreferred-stack-boundary)。因此,在函数调用之前,ESP 16的结果必须为零。

记住这些堆栈对齐要求,我假设在执行leave指令之前以下堆栈的状态表示是正确的:

Size (bytes)       Stack          ESP mod 16      Description
-----------------------------------------------------------------------------------

             |     . . .      |             
             ------------------........0          at func call
         4   | return address |
             ------------------.......12          at func entry
         4   |   saved …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc abi memory-alignment

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

MacOS 汇编的 64 位系统调用文档

我无法找到在 MacOS 上编写 64 位程序集的良好文档。

64位 SysV ABI在 A.2.1 节中说了以下内容,并且此 SO 帖子引用了它:

  • 系统调用是通过 syscall 指令完成的。内核销毁寄存器%rcx 和%r11。

  • 从系统调用返回,寄存器 %rax 包含系统调用的结果。-4095 到 -1 之间的值表示错误,它是 -errno。

这两句话在 Linux 上没问题,但在 macOS Sierra 上却是错误的,代码如下:

global _start
extern _exit

section .text
_start:

; Align stack to 16 bytes for libc
and rsp, 0xFFFFFFFFFFFFFFF0

; Call write
mov rdx, 12             ; size
mov rsi, hello          ; buf
mov edi, 1              ; fd
mov rax, 0x2000004      ; write ; replace to mov rax, 0x1 …
Run Code Online (Sandbox Code Playgroud)

macos assembly x86-64 system-calls abi

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

如果我们为每个 ABI 上传不同的 apk,我们是否需要上传通用 apk

我的应用程序大小已达到 117 MB,因为 Play 商店不允许上传超过100 MB的 apk 。

所以我使用split并创建了多个版本的 apk,每个版本都基于不同的ABI

如果我分析universal-apk,我ABI's在 lib 文件夹中得到了这些类型;

  • armeabi-v7a
  • x86
  • 阿米比

在此处输入图片说明

我用它来separate apk为每个创建abi

splits {
    abi {
        enable true
        reset()
        include 'x86', 'armeabi-v7a', 'armeabi'
        universalApk true
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我得到了 4 种类型的 apk。的universal-apk大小为117 MB,其中,如armeabi为68 MB。

在此处输入图片说明

所以很明显,我无法上传universal-apkon Play 商店,因此我最终会上传3 apk's游戏商店。

现在我的问题是那些用户会发生什么 cpu architecture不属于这些类别的。

我注意到 Galaxy S7 是arm64-v8a,除了这些之外,市场上还会有其他一些架构可用,所以如果这些设备universal-apk不存在,会发生什么,或者armeabi-v7ax86有足够的目标都在市场上的设备。

这会减少目标应用程序用户吗?我无法找出 …

performance android abi google-play android-gradle-plugin

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

abi.encodePacked(...) 和 sha256(..) 如何在 Solidity 中工作?

我正在尝试在 Solidity 合同中实现签名,但在比较哈希时遇到了问题。我使用以下代码计算哈希值:

sha256(abi.encodePacked(param1, ...., paramN);
Run Code Online (Sandbox Code Playgroud)

在哪里:

abi.encodePacked(param1, ..., paramN) = [bytes: 0x0102030405060701]

sha255(abi.encodePacked(param1, ..., paramN)) = [bytes32: 0x245138c905599c8579ab186fbdbd6e62396aac35a98a6568f8803eed049d1251]

我在的主要问题是,通过使用Python的SHA256 0102030405060701我得到的结果是5bc31e3decf480124c79c114744d111ec82b62e466a097c3ced6fe76cbace9a5

我究竟做错了什么?

abi sha256 blockchain ethereum solidity

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

Android ABI 拆分迁移到 App Bundle

我计划从 ABI 拆分迁移到 App Bundle 功能。目前我正在使用此代码:

def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]

    splits {
        abi {
            enable true
            reset()
            include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
            // "armeabi", "mips", "mips64" last three not needed and not supported currently
            universalApk true
        }
    }

    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
            if (abi != null) {
                output.versionCodeOverride =
                        abi * 1000 + variant.versionCode
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

每个 ABI 提供 4 个 APK(+ 通用一个)。使用此代码的原因是为了减少应用程序的大小,因为PanoWidget …

android abi renderscript android-app-bundle

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

C++ 当你从一个函数返回一个结构体时,在汇编中实际发生了什么?

我试图弄清楚如果你从函数中按值返回一个结构体,而不是返回一个指向该结构体的指针,那么在 C++ 中实际发生了什么。如果一个函数只能返回一个可以放入寄存器的值,那么在按值发送结构时如何进行通信?(我在某处读到过。)

我尝试在 Godbolt 上测试它,看看它在做什么。但我不了解大会,所以这对我有点乐观。

在我看来,在没有太多汇编知识的情况下,该函数只是更改了调用该函数之前存在的一些内存?那么return从函数中调用某些东西的概念只是一个抽象,函数只是在已经存在的内存位置设置一些字节,然后跳回到main()? 在这种情况下,根本不会复制任何内容并且返回是“免费的”?

Godbolt:返回整数

Godbolt:返回 struct{int int int}

c++ assembly x86-64 abi calling-convention

5
推荐指数
2
解决办法
147
查看次数