首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在32位计算机上使用.so时出错:"wrong ELF class: ELFCLASS64

"。

这个错误是由于在32位计算机上尝试加载一个64位的共享对象(shared object)文件导致的。ELF(Executable and Linkable Format)是一种可执行文件和共享对象文件的标准格式,其中包含了程序的二进制代码和数据。

在计算机体系结构中,32位和64位是指处理器的寻址能力和数据处理能力。32位计算机只能处理32位的地址和数据,而64位计算机可以处理64位的地址和数据。因此,32位计算机无法正确解析和执行64位的共享对象文件,导致出现"wrong ELF class: ELFCLASS64"错误。

要解决这个问题,可以采取以下几种方法:

  1. 确认计算机体系结构:首先要确认自己使用的是32位计算机,而不是64位计算机。可以通过查看操作系统的系统信息或者使用命令行工具来确认。
  2. 使用适合的共享对象文件:根据计算机的体系结构选择合适的共享对象文件。如果使用的是32位计算机,需要使用32位的共享对象文件。
  3. 编译适合的共享对象文件:如果只有64位的共享对象文件可用,可以考虑重新编译该共享对象文件为32位版本。这需要使用适合的编译器和编译选项来生成32位的共享对象文件。

总结起来,"wrong ELF class: ELFCLASS64"错误是由于在32位计算机上尝试加载64位的共享对象文件导致的。解决方法包括确认计算机体系结构、使用适合的共享对象文件或重新编译共享对象文件为32位版本。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OpenCV学习之路–5–OpenCV3.4.10的ARM版本移植到开发板

但是就如此简单的内容为何会单独列一章呢,因为移植过程中会遇到一个问题: /lib/libstdc++.so.6: version `GLIBCXX_3.4.11′ not found (required...by /lib/libopencv_core.so.3.4) 解决方法: 1.ubuntu中使用 find / -name "libstdc++.so*" 会出现好多文件,但是我们移植的时候需要注意...rm -rf libstdc++.so.6 将默认库的软连接指向最新动态库 ln -s libstdc++.so.6.0.19 libstdc++.so.6 检查动态库 strings libstdc+...+.so.6 | grep GLIBC 注意:如果移植成x86-64版本的libstdc++.so.6.0.21会出现下面的错误 error while loading shared libraries...: libstdc++.so.6: wrong ELF class: ELFCLASS64 原因是开发板运行ARM版本的,结果使用的是x86-64版本的。

1.2K10
  • 详解ELF可执行文件格式:读取头部信息和程序表头

    文件头描述了ELF文件很多重要信息,例如它运行的平台,支持的CPU类型等。使用命令行readelf -h 可以读取指定ELF文件的头部信息,如下图所示: ?...e_machine用于表明它运行的CPU类型,e_entry表示它被加载到内存后,第一条指令所在的虚拟地址,e_phoff表示程序表头相对于该文件内部偏移,后面我们要读取程序表头需要使用该值。...该数据结构中有很多字段我们不需要关系,需要关心的也就是程序表头和段表头对应的字段,这些字段的使用在后续说明中会详细解读,我们首先展示如何使用python实现ELF文件头的解读,其中链接: https:/...= int.from_bytes(magic[4], "little") #32位还是64位 if elf_class == ELFCLASS32: print("class ELF32...") if elf_class == ELFCLASS64: print("class ELF64") endian = int.from_bytes(magic[5], "

    4.1K20

    linux常用命令--开发调试篇

    /cmdTest a=10,b=0 Floating point exception (core dumped) 程序内容是main函数中调用test,计算a/b的值,其中b的值为0,因此程序由于除...但是要特别注意的是,“瘦身”之后的elf文件由于没有了符号信息,许多调试命令将无法正常使用,出现core dump,问题也较难定位,因此只建议正式发布对其进行“瘦身”。...7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 #elf文件魔数字 Class: ELF64...#1 0x000000000040052c in main (argc=1, argv=0x7ffca9536d38) at cmdTest.c:10 (gdb) 输入bt后,就可以看到调用栈了,出错位置...(divide error)和出错位置(40053b),我们使用addr2line命令获取出错具体行号: addr2line -e cmdTest 40053b /home/hyb/practice/cmdTest.c

    1.5K30

    几个命令了解ELF文件的”秘密“

    来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 Linux中,可执行文件的格式是ELF格式,而有一些命令可以帮助我们了解它们更多的“秘密”,以此来帮助我们解决问题...00 00 00 00 00 Class: ELF64 Data: 2's.../x86_64-linux-gnu/libc.so.6,而如果该文件不存在,则运行时将会出错。...为ELF文件瘦身 前面通过file查看文件,看到有not stripped的字样,由于它里面包含了一些符号表信息,因为文件会稍大,如果去掉,二进制文件将会变小,但是里面的符号表信息也就没有了,将会影响问题定位...总结 ELF文件中隐藏了丰富的信息,只要使用得当,将会帮助我们更好地进行开发或者问题的定位。

    2.3K20

    Linux Kdump 机制详解

    它的主要流程如下图所示: 可以看到它的核心原理是保留一段内存并且预先加载了一个备用的 kernel,主 kernel 出现故障跳转到备用 kernel,备用 kernel 中把主 kernel...使用的内存和发生故障的寄存器信息 dump 到一个磁盘文件中供后续分析。...准备 elf header (运行在 normal kernel) 系统发生故障状态是很不稳定的,时间也是很紧急的,所以我们 normal kernel 中就尽可能早的把 /proc/vomcore... kexec_tools 使用 kexec_file_load() 系统调用加载 crash kernel ,就顺带把 /proc/vmcore 的 elf header 需要的大部分数据准备好了:... + 1);  memcpy(ehdr->e_ident, ELFMAG, SELFMAG);  ehdr->e_ident[EI_CLASS] = ELFCLASS64;  ehdr->e_ident

    6K20

    吴章金: 如何创建一个*可执行*的共享库

    前者和后者通常情况下是独立存在的,是联合行动的,两者差异明显: 可执行文件有标准的 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址链接是相对的...,在装载动态分配和计算符号地址 接下来做个实验具体看看两者的区别,准备一个“烂大街”的 hello.c 先: #include int main(void) { printf...如果没有 -rdynamic,链接就没法使用。...\n"); } 当普通共享库使用,默认编译即可,要能够执行的话,实现一下 entry(),编译打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so...小结 本文详细讲解了如何像 libc.so 和 ld-linux.so 一样,既可以当共享库使用,还能直接执行,并且讲述了两种方法。

    1.1K20

    webview接入HttpDNS实践

    减少用户跨网访问,降低用户解析域名延。...如果项目中用的网络库是okhttp,所有的网络请求都是通过它完成的话就可以使用okhttp提供的DNS解析接口,实现自己的DNS resolver,代码如下: public class HttpDns...getaddrinfo是libc.so中的定义的,其它库如libandroid_runtime.so、libjavacore.so使用这个函数的话,只能通过动态导入符号的形式,好在java网络库底层是就是通过这个方式实现的...找到libjavacore.so中getaddrinfo导入符号的位置: ? ? 定位到getaddrinfoplt表中引用的位置: ?...解决方法是通过一个脚本,pull下测试设备上的所有so到主机上,然后用readelf工具查找so的导入符号,观察是否有getaddrinfo字样的导入符号。 为此我写了一个脚本,方便自动化进行。

    3.7K61

    自动识别Android不合理的内存分配

    本文介绍了一种Art虚拟机上实时记录对象分配的实现方案,基于此方案就可以实现不合理对象分配的自动化的识别。...录制对性能影响很小,但每次获取录制记录特别慢(开发机实测JDWP封包5秒以上,解包处理10秒以上)。 每次获取到的记录可能有重复,要使用这个数据需要额外做合并去重的操作。...这是什么对象 你也许已经发现RecordAllocation还有一个参数是art::mirror::Class*,这是Java里Class虚拟机里的镜像,我们知道Java里拿到Class,就能直接调用...我们应该用一种更通用的方法,那就是直接解析ELF 1.3 搜索函数地址 之 解析ELF so是一种ELF格式的文件,Android系统里由linker加载到内存。...不过基址是系统加载so记录的,这个应该不会有错;搜索出来的函数偏移和用IDA查看的函数偏移也是一致的。问题到底在哪?

    5.2K3625

    Android远程调试的探索与实现

    常见的调查线上棘手问题方式大概如下: 以上两种方法之前调查线上问题都有使用,但因为二者都有明显的缺点,所以效果不是特别理想。...使用新的gJdwpOptions参数重新启动JDWP-Thread。 Android中,JDWP相关代码分别被编译成libart.so(Art)和libdvm.so(Dalvik)。...修改或调用其他so库中的代码需要用到动态加载,使用动态加载,应用程序需要先指定要加载的库,然后将该库作为一个可执行程序来使用(即调用其中的函数)。...下面表格展示了这个完整的 API: 介绍如何调用动态加载功能之前,先介绍一下C/C++编译器在编译目标文件所进行的名字修饰(符号化)。...一般为了应用发生崩溃能获取到调用栈中每个函数对应的行号,需要保留LineNumberTable,同时为了减少包体积会放弃LocalVariableTable。

    2.1K30

    Android Linker 与 SO 加壳技术

    ElfReader::Load 方法首先读取 SOelf header,再对elf header进行验证,之后读取program header,根据program header 计算 SO 需要的内存大小并分配相应的空间...将 program header 在内存中单独映射一份,用于解析program header 临时使用 SO 装载到内存后,便会释放这块内存,转而使用装载后的 SO 中的program header...关于loadbias: SO 可以指定加载基址,但是 SO 指定的加载基址可能不是页对齐的,这种情况会导致实际映射地址和指定的加载地址有一个偏差,这个偏差便是 load_bias_,之后针对虚拟地址进行计算需要使用...计算 segment 文件中的页对齐后的起始地址 file_page_start 和长度 file_length。...3.2.1 装载 还原后的 SO 在内存中,所以装载的主要变化就是从文件装载到从内存装载。 Linker 在装载 PT_LAOD segment使用 SO 文件的描述符 fd: ?

    3.1K61

    elf格式分析

    大概包含编制好的计算机指令,数据,计算须要的时候把这个文件读取到内存中,cpu就能够从内存中一条一条的读取指令来运行了。...所以说想明确elf格式,我们应该了解一下计算机运行程序须要那些信息。所以这一节,我们补充一些计算机系统的基础知识。...事实上计算机的内存是没有那么大的,比方我们实际使用计算机仅仅有2G,曾经更小,仅仅有几百M,并且一台计算机上不仅仅执行一个进程,一个占用4G,假设有10个进程,那就得着用40G了,哪有那么打的内存呢?...elf文件分三种类型: 1、目标文件(一般是.o); 2、可执行文件(我们的执行文件) 3、动态库(.so) 我们先讲一下可运行文件。...00 00 00 00 00 Class: ELF64 Data:

    81121

    黑客级别的文章:把动态库的内存操作玩出了新花样!

    计算地址的精确方法是什么? 目标 ELF 使用的编译选项对 hook 有什么影响? hook 遇到偶发的段错误时什么原因?如何处理? ELF 内部函数之间的调用能 hook 吗?...libtest.so的代码虽然看上去有些愚蠢,但是它居然可以正确的工作,那还有什么可抱怨的呢? 赶紧新版APP中开始使用它吧!...计算 ELF 基地址。...问题分析: 读内存发生段错误其实是无害的。 我 hook 执行的流程中,需要直接通过计算内存地址的方式来写入数据的地方只有一处:即替换函数指针的最关键的那一行。...对于内部函数来说,比如一个使用static关键字修饰的函数,编译器在编译,可能就直接把函数的地址“硬编码”引用它的地方了。

    1.3K20
    领券