32位下用ndk编译libtask出现这样的错误:

[armeabi-v7a] Compile thumb  : task <= context.c
/Users/ahfu/code/android/android-ndk-r14b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang -MMD -MP -MF /Users/ahfu/code/gitcode/ahfuzhang/daily_coding/source_code/libtask-master/libtask//obj/local/armeabi-v7a/objs-debug/task/context.o.d -gcc-toolchain /Users/ahfu/code/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 -fpic -ffunction-sections -funwind-tables -fstack-protector-strong -Wno-invalid-command-line-argument -Wno-unused-command-line-argument -no-canonical-prefixes -fno-integrated-as -g -target armv7-none-linux-androideabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -O0 -UNDEBUG -fno-limit-debug-info -mfpu=neon -I./ -I./ -DANDROID -g -pie -fPIC -DANDROID_ARM_NEON=TRUE -DANDROID_TOOLCHAIN=arm-linux-androideabi-gcc -O2 -Wa,--noexecstack -Wformat -Werror=format-security --sysroot /Users/ahfu/code/android/android-ndk-r14b/platforms/android-21/arch-arm -c .//context.c -o /Users/ahfu/code/gitcode/ahfuzhang/daily_coding/source_code/libtask-master/libtask//obj/local/armeabi-v7a/objs-debug/task/context.o
.//context.c:124:19: error: no member named 'regs' in 'struct sigcontext'
uc->uc_mcontext.regs[i] = va_arg(arg, uint);
~~~~~~~~~~~~~~~ ^
.//context.c:127:18: error: no member named 'regs' in 'struct sigcontext'
uc->uc_mcontext.regs[13] = (uint)sp;
~~~~~~~~~~~~~~~ ^
.//context.c:128:18: error: no member named 'regs' in 'struct sigcontext'
uc->uc_mcontext.regs[14] = (uint)fn;
~~~~~~~~~~~~~~~ ^
3 errors generated.

通过查看头文件 /Users/ahfu/code/android/android-ndk-r14b/platforms/android-24/arch-arm/usr/include/asm/sigcontext.h

发现结构体的定义与上面使用的结构体并不相同:

#ifndef _ASMARM_SIGCONTEXT_H
#define _ASMARM_SIGCONTEXT_H
struct sigcontext {
unsigned long trap_no;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long error_code;
unsigned long oldmask;
unsigned long arm_r0;
unsigned long arm_r1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long arm_r2;
unsigned long arm_r3;
unsigned long arm_r4;
unsigned long arm_r5;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long arm_r6;
unsigned long arm_r7;
unsigned long arm_r8;
unsigned long arm_r9;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long arm_r10;
unsigned long arm_fp;
unsigned long arm_ip;
unsigned long arm_sp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long arm_lr;
unsigned long arm_pc;
unsigned long arm_cpsr;
unsigned long fault_address;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif

于是context.c中这样修改代码,解决了32位下的编译问题:

#ifdef NEEDARMMAKECONTEXT

#if defined(__linux__) && defined(__arm__)

void
makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
{
int i, *sp;
va_list arg;
sp = (int *)uc->uc_stack.ss_sp + uc->uc_stack.ss_size / 4;
va_start(arg, argc);
for (i = 0; i < 4 && i < argc; ++i) {
switch (i){
case 0:
uc->uc_mcontext.arm_r0 = va_arg(arg, uint);
break;
case 1:
uc->uc_mcontext.arm_r1 = va_arg(arg, uint);
break;
case 2:
uc->uc_mcontext.arm_r2 = va_arg(arg, uint);
break;
case 3:
uc->uc_mcontext.arm_r3 = va_arg(arg, uint);
break;
}
}
va_end(arg);
uc->uc_mcontext.arm_sp = (uint)sp;
uc->uc_mcontext.arm_lr = (uint)fn;
} #elif defined(__linux__) && (defined(__arm64__) || defined(__aarch64__)) void
makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...)
{
int i, *sp;
va_list arg;
sp = (int *)uc->uc_stack.ss_sp + uc->uc_stack.ss_size / 4;
va_start(arg, argc);
for (i = 0; i < 4 && i < argc; ++i) {
uc->uc_mcontext.regs[i] = va_arg(arg, uint);
}
va_end(arg);
uc->uc_mcontext.regs[13] = (uint)sp;
uc->uc_mcontext.regs[14] = (uint)fn;
} #else
#error unknown platform
#endif #endif

总结:

  • arm32与arm64的寄存器结构差异较大
  • libtask号称支持ARM,但是ndk编译的时候一堆问题。
  • 相比之下,32位的libtask有可能编译并最终投入使用;arm64因为无法访问pc寄存器,这个难度略高。

【记录一个问题】没用任何用处的解决了libtask的context.c在32位NDK下的编译问题的更多相关文章

  1. 入坑Intel OpenVINO:记录一个示例出错的原因和解决方法

    今天试用OpenVINO的例子,在过程中发现了一些其他人没有经历的坑特别记录一下. 出错时候:执行Intel OpenVINO示例的是时候,出错的提示代码: 用于 .NET Framework 的 M ...

  2. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  3. IIS报错试图加载格式不正确的程序集解决办法 64位WinServer系统兼容32位程序集

    问题描述:     将网站/WCF发布到IIS后运行报这个错. 原因:     64位系统和32系统不匹配导致. 解决办法:     方法一.注册32位IIS(必须卸载64位IIS)         ...

  4. vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录

    一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...

  5. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

  6. 【记录一个问题】用毫无用处的方法解决了libtask的asm.S在ndk下编译的问题

    昨天提到,libtask中的asm.S使用的是ARM 32位的语法,因此在ARM 64下无法编译通过. 于是查了一下资料,改写了一下汇编代码,使得可以在64位下编译通过.源码如下 #if define ...

  7. 记录一个bootstrap惨痛的错误

    记录一个bootstrap的错误,这个错误因为我删除了一个class就导致了页面上显示的错误,这是一个惨痛的教训,特此记录,提醒自己在做前端的修改时,一定要慎之又慎.如果真的要做改动,改完之后也要测一 ...

  8. step_by_step_记录一个javascript字符串处理问题

    记录一个javascript字符串处理的问题 这一天下班,技术QQ群里的大神提出了一个问题,带着问题去思考. ? '---9890.999008-555555-55555555----' 对于这样的字 ...

  9. 一个ping大包不通问题的解决过程

    1.问题描述 存在问题: 深圳的采集机MQ程序无法与应用服务器进行通讯,表现为:获取小数据时正常,获取大数据时超时 场景图如下 2.数据下载测试 使用SCP工具和FTP工具进行数据下载测试,主要是想排 ...

随机推荐

  1. JAVA将Object对象转byte数组

    /** * 将Object对象转byte数组 * @param obj byte数组的object对象 * @return */ public static byte[] toByteArray(Ob ...

  2. King's Order(hdu5642)

    King's Order  Accepts: 381  Submissions: 1361  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  3. 1065 - Number Sequence &&1070 - Algebraic Problem

    1065 - Number Sequence   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  4. golang 数组的一些自问自答

    所有代码基于Go-1.17.一些研究Go数组的自问自答,可以考虑作为面试题. 问题:静态存储区是什么?和堆/栈有什么区别? 回答: 可以参考下列图 堆上存放new产生的大块内存 栈上存放的是程序运行的 ...

  5. PowerDotNet平台化软件架构设计与实现系列(10):文件平台

    很多业务系统少不了需要进行文件管理,比如各种图片.excel.pdf.压缩包等等,为了高度可复用,我们抽象出文件平台,加强对文件进行管理. PowerDotNet文件平台目前支持阿里云OSS.Fast ...

  6. (原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题

    一.前言 使用WinForm很久了,多多少少会遇到一些小BUG. 这些小BUG影响并不严重,而且稍微设置一下就能正常使用,而且微软一直也没有修复这些小BUG. 写本系列文章,是为了记录一下这些无伤大雅 ...

  7. C++输出控制小数点后位数的方法

    以C++输出小数点两位数为例 setprecision(n)使用方法总结 首先要记住写头文件 #include <iomanip> //不要忘了头文件 以下是控制小数位数的三种写法 //t ...

  8. JPEG原理详解 (转载)

    JPEG算法解密 by jinchao   图片压缩有多重要,可能很多人可能并没有一个直观上的认识,举个例子,一张800X800大小的普通图片,如果未经压缩,大概在1.7MB左右,这个体积如果存放文本 ...

  9. CONTRASTIVE REPRESENTATION DISTILLATION

    目录 概 主要内容 超参数的选择 代码 Tian Y., Krishnan D., Isola P. CONTRASTIVE REPRESENTATION DISTILLATION. arXiv pr ...

  10. Java面向对象笔记 • 【第7章 集合】

    全部章节   >>>> 本章目录 7.1 集合概述 7.1.1 Java集合体系概述 7.1.2 实践练习 7.2 List集合 7.2.1 ArrayList实现类 7.2. ...