abi

插件化框架解读之so 文件加载机制(四)

不羁岁月 提交于 2019-12-06 12:28:48
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 提问 本文的结论是跟着 System.loadlibrary() 一层层源码走进去,个人对其的理解所整理的,那么开始看源码之前,先来提几个问题: Q1:你知道 so 文件的加载流程吗? Q2:设备存放 so 的路径有 system/lib,vendor/lib,system/lib64,vendor/lib64,知道在哪里规定了这些路径吗?清楚哪些场景下系统会去哪个目录下寻找 so 文件吗?还是说,所有的目录都会去寻找? Q3:Zygote 进程是分 32 位和 64 位的,那么,系统是如何决定某个应用应该运行在 32 位上,还是 64 位上? Q4:如果程序跑在 64 位的 Zygote 进程上时,可以使用 32 位的 so 文件么,即应用的 primaryCpuAbi 为 arm64-v8a,那么是否可使用 armeabi-v7a 的 so 文件,兼容的吗? Q2,Q3,Q4,这几个问题都是基于设备支持 64 位的前提下,在旧系统版本中,只支持 32 位,也就没这么多疑问需要处理了。 源码 准备工作 由于这次的源码会涉及很多 framework 层的代码,包括 java 和 c++,直接在 AndroidStudio 跟进 SDK

STL Containers and Binary Interface Compatibility

末鹿安然 提交于 2019-12-06 10:56:23
问题 STL Binary Interfaces I'm curious to know if anyone is working on compatible interface layers for STL objects across multiple compilers and platforms for C++. The goal would be to support STL types as first-class or intrinsic data types. Is there some inherent design limitation imposed by templating in general that prevents this? This seems like a major limitation of using the STL for binary distribution. Theory - Perhaps the answer is pragmatic Microsoft has put effort into .NET and doesn't

【转】关于Android的.so文件你所需要知道的 (一)

心不动则不痛 提交于 2019-12-06 08:14:39
原文链接 早期的Android系统几乎只支持ARMv5的CPU架构,你知道现在它支持多少种吗?7种! Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。应用程序二进制接口( A pplication B inary I nterface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。 为什么你需要重点关注.so文件 如果项目中使用到了NDK,它将会生成.so文件,因此显然你已经在关注它了。如果只是使用Java语言进行编码,你可能在想不需要关注.so文 件了吧,因为Java是跨平台的。但事实上,即使你在项目中只是使用Java语言,很多情况下,你可能并没有意识到项目中依赖的函数库或者引擎库里面已经 嵌入了.so文件,并依赖于不同的ABI。 例如,项目中使用RenderScript支持库,OpenCV,Unity,android-gif-drawable

学习:APP_ABI

痴心易碎 提交于 2019-12-06 07:55:32
在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。 目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。 CPU架构 ABI ARMv5 armeabi 32位,从2010年 ARMv7 armeabi-v7a 32位,从2010年 x86 x86 32位,从2011年 MIPS mips 32位,从2012年 ARMv8 arm64-v8a 64位,从2014年 MIPS64 mips64 64位,从2014年 x86_64 x86_64 64位,从2014年 相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。例如指明某个具体的CPU架构 APP_ABI := arm64-v8a 或者直接生成所有的版本 APP_ABI := all 注意: 根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。 或者明确写明支持的CPU架构 APP_ABI := armeabi,armeabi

Why this dead store of unique_ptr cannot be eliminated?

为君一笑 提交于 2019-12-06 07:48:35
问题 #include <memory> #include <vector> using namespace std; vector<unique_ptr<int>> e; void f(unique_ptr<int> u) { e.emplace_back(move(u)); } For both Clang and GCC, the above code snippet generates something like: f(std::unique_ptr<int, std::default_delete<int> >): mov rsi, QWORD PTR e[rip+8] # rsi: vector.end_ptr cmp rsi, QWORD PTR e[rip+16] # [e + rip + 16]: vector.storage_end_ptr je .L52 # Slow path, need to reallocate mov rax, QWORD PTR [rdi] # rax: unique_ptr<int> u add rsi, 8 # end_ptr +=

Compilation failing on EnableABIBreakingChecks

送分小仙女□ 提交于 2019-12-06 06:42:18
问题 I recently installed LLVM v8.0.0 (on RHEL 7.4). I am going through the LLVM Kaleidoscope tutorial to learn how to use the system, but am running into an issue linking. Per the tutorial (end of chapter 2), I run: clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld It compiles, but the linker fails on: /tmp/kld-f7264f.o:(.data+0x0): undefined reference to `llvm::EnableABIBreakingChecks' clang-8: error: linker command failed with exit code 1 (use -v to see invocation) I suspected this may

Android.mk文件语法规范

泄露秘密 提交于 2019-12-06 06:42:03
序言: ————- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件。 为了明白下面的内容,你必须已经阅读了docs/OVERVIEW.TXT的内容,它解释了Android.mk文件扮演的角色 和用途。 概述: ——— 写一个Android.mk文件是为了向生成系统描述你的源代码。更明确的说: - 这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。 因此,你应该在Android.mk里尽量少地声明变量,而不要误以为在解析的过程中 没有任何东西被定义。 - 该文件的语法的明的人为了让你能将你的源代码组织为组件(module).一个组件指的是下面的一项: - 一个静态库(static library) - 一个共享库(shared library) 只有一个动态库会被安装/拷贝至你的application package中。但是静态库可用来 生成动态库。 你可以在每个Android.mk文件定义一个或多个组件,并且我可以在几个组件中使用 相同的源文件。 - 生成系统为你处理了一些琐碎之事。比如,在你的Android.mk里,你不须要列出头文件或 列出生成的文件之间的明确认依赖关系。NDK生成系统会为你自动生成。 这也意味着,当更新至新的NDK版本时,你能得到新的工具链/平台支持

How to demangle a C++ name in clang (or gcc)?

折月煮酒 提交于 2019-12-06 06:03:23
问题 I'm trying to write a quick-and-dirty demangler for clang. I've found a piece of code that uses abi::__cxa_demangle , but I can't figure out which header it requires. The obvious choice is ABI.h but: demangle.cpp:2:10: fatal error: 'ABI.h' file not found #include <ABI.h> ^ What do I need to use abi::__cxa_demangle ? 回答1: Include cxxabi.h . In Ubuntu 13 this header is in /usr/include/c++/4.x where x is minor gcc version. 回答2: Include cxxabi.h, but for clang on Ubuntu you'll need to install the

Why does this function push RAX to the stack as the first operation?

佐手、 提交于 2019-12-06 04:22:15
In the assembly of the C++ source below. Why is RAX pushed to the stack? RAX, as I understand it from the ABI could contain anything from the calling function. But we save it here, and then later move the stack back by 8 bytes. So the RAX on the stack is, I think only relevant for the std::__throw_bad_function_call() operation ... ? The code:- #include <functional> void f(std::function<void()> a) { a(); } Output, from gcc.godbolt.org , using Clang 3.7.1 -O3: f(std::function<void ()>): # @f(std::function<void ()>) push rax cmp qword ptr [rdi + 16], 0 je .LBB0_1 add rsp, 8 jmp qword ptr [rdi +

passing rvalue to non-ref parameter, why can't the compiler elide the copy?

爷,独闯天下 提交于 2019-12-05 14:38:31
struct Big { int a[8]; }; void foo(Big a); Big getStuff(); void test1() { foo(getStuff()); } compiles (using clang 6.0.0 for x86_64 on Linux so System V ABI, flags: -O3 -march=broadwell ) to test1(): # @test1() sub rsp, 72 lea rdi, [rsp + 40] call getStuff() vmovups ymm0, ymmword ptr [rsp + 40] vmovups ymmword ptr [rsp], ymm0 vzeroupper call foo(Big) add rsp, 72 ret If I am reading this correctly, this is what is happening: getStuff is passed a pointer to foo 's stack ( rsp + 40 ) to use for its return value, so after getStuff returns rsp + 40 through to rsp + 71 contains the result of