- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试使用 LLVM's stackmap feature 编写一个基本的 C 堆栈遍历器。我已经生成了堆栈图,现在我尝试将堆栈图传递给 C 函数,以便我可以使用它。
特别是,我在将 __LLVM_StackMaps
传递给我的堆栈遍历器时遇到问题。我尝试将其作为汇编函数的参数传递:
.text
.globl stackHelper
.extern stackWalker
.extern __LLVM_StackMaps
stackHelper:
mov %rsp, %rdi
mov __LLVM_StackMaps, %rsi
jmp stackWalker
我收到错误(.text+0x7):对“__LLVM_StackMaps”的 undefined reference
。
objdump 表示 __LLVM_StackMaps
不在 .text 或 .data 中,而是在自定义 .llvm_stackmaps
部分中。这是 objdump 输出:
factorial.o: file format elf64-x86-64
factorial.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000067 0000000000000000 0000000000000000 00000040 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .rodata.str1.1 00000005 0000000000000000 0000000000000000 000000a7 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.GNU-stack 00000000 0000000000000000 0000000000000000 000000ac 2**0
CONTENTS, READONLY
3 .llvm_stackmaps 00000050 0000000000000000 0000000000000000 000000b0 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
4 .eh_frame 00000050 0000000000000000 0000000000000000 00000100 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 factorial.ll
0000000000000000 l .llvm_stackmaps 0000000000000000 __LLVM_StackMaps
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .rodata.str1.1 0000000000000000 .rodata.str1.1
0000000000000030 g F .text 0000000000000037 fact
0000000000000000 g F .text 0000000000000023 main
0000000000000000 *UND* 0000000000000000 printf
0000000000000000 *UND* 0000000000000000 stackHelper
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
0000000000000011 R_X86_64_32 .rodata.str1.1
000000000000001b R_X86_64_PC32 printf-0x0000000000000004
000000000000004e R_X86_64_PC32 stackHelper-0x0000000000000004
RELOCATION RECORDS FOR [.llvm_stackmaps]:
OFFSET TYPE VALUE
0000000000000010 R_X86_64_64 fact
RELOCATION RECORDS FOR [.eh_frame]:
OFFSET TYPE VALUE
0000000000000020 R_X86_64_PC32 .text
0000000000000034 R_X86_64_PC32 .text+0x0000000000000030
我的猜测是它无权访问此表中的符号。有没有办法从我的汇编函数访问这些数据,或者我需要在链接阶段做一些事情以允许它正确访问这些数据?
最佳答案
@Jester 指出的问题是该符号被标记为本地符号,因此仅对其出现的文件可见。
0000000000000000 l .llvm_stackmaps 0000000000000000 __LLVM_StackMaps
第一列地址后面的l
表示符号是LOCAL。 g
表示它是全局并且对外部对象可见。
如果无法通过源代码将factorial中的符号更改为非静态,那么可以使用OBJCOPY直接更改目标文件中符号的可见性: p>
objcopy --globalize-symbol=__LLVM_StackMaps factorial.o factorial.o
第一个目标文件factorial.o
是要处理的输入文件,第二个factorial.o
是输出文件。如果您愿意,您可以指定不同的输出对象。我的示例用更改覆盖了原始的factorial.o。生成的 factorial.o
现在应该有一个类似于以下内容的条目:
0000000000000000 g .llvm_stackmaps 0000000000000000 __LLVM_StackMaps
选项--globalize-symbol
在OBJCOPY documentation中描述。如:
--globalize-symbol=symbolname
Give symbol symbolname global scoping so that it is visible outside of the file in which it is defined. This option may be given more than once.
关于assembly - 来自 asm/C 的 LLVM StackMap 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149306/
我一直在努力了解晦涩的堆栈映射框架,它在一次通过中验证动态加载类的作用。 我发现非常有用的堆栈溢出答案和其他资源很少 Is there a better explanation of stack ma
我们正在使用最新的 JDK 7 (u45) 和 ProGuard 版本 4.10 最近开始我们的分发失败,在混淆之后,出现以下错误: Exception in thread "main" java.l
我们正在使用一些涉及字节码增强器的闭源商业应用程序框架。虽然字节码增强器可以处理 Java 7 字节码,但它需要在启动 JVM 时使用“-XX:-UseSplitVerifier”标志。 我们刚刚更新
我在 Web 应用程序启动时遇到异常,因为 guice 正在尝试构造提到的类。 java.lang.VerifyError: Inconsistent stackmap frames at branc
我收到一个错误,但我完全不知道如何修复它。环顾 stackoverflow,这个错误似乎与损坏的文件或在不兼容的 Java 版本中编译的类有关。这是我一直在研究的问题之一:Causes of gett
有没有办法将自定义 HttpServlet 加载到 GAE?我上传了一个在 .server 包中包含 HttpServlet 的项目,并将其添加到 web.xml... testServlet
我正在尝试使用 Spring 工具套件 3.8.3 在 Ubuntu 16.04 上。启动时出现此错误: An internal error occured during: "Initializing
我在此版本的 Java 中使用 Maven 3.2.3 davea$ echo $JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk
我目前正在尝试使用 LLVM's stackmap feature 编写一个基本的 C 堆栈遍历器。我已经生成了堆栈图,现在我尝试将堆栈图传递给 C 函数,以便我可以使用它。 特别是,我在将 __LL
使用jdk 1.8.0_51源=1.7,目标=1.7Junit 4.6, Ant 1.8.0 发生了什么事? 所有通过 1.7 的测试现在都失败了。我需要了解以下内容: 为什么会这样? 有没有像-XX
我使用jdk 1.7,jekins,maven,当我构建项目时,单元测试失败,错误是: java.lang.VerifyError: Expecting a stackmap frame at bra
成功编译项目并使用 Maven 构建。这是我的第一个 Maven 项目。但我不知道为什么会出现以下错误。 在 tomcat 上部署 war 并点击我的 url 并在我的浏览器中显示以下错误。 java
我在 Tomcat 8 和 JDK 8 中使用 ASM 5.0.3 字节码修改库。 我的目的是将字节码成功地注入(inject)到所有的类中。但是,我遇到了以下错误: java.lang.Verify
当我尝试部署 war 文件时出现以下错误。 SEVERE: WSSERVLET11: failed to parse runtime descriptor: java.lang.VerifyError
java.lang.VerifyError: Inconsistent stackmap frames at branch target 775 Exception Details: Location
我最近将我的项目从 Java 1.7 升级到 Java 1.8。 我的一个类中的某个方法出现堆栈映射不一致的异常。 在方法中初始化一些未分配的局部变量解决了它,但有人可以解释为什么在 Java 8 中
我有一个使用 Akka 的 Java 应用程序 Typed Actors .该代码在 Eclipse 中没有错误,但是当我启动我的应用程序时它崩溃并打印此错误: Exception in thread
我有一个使用 Play Framework 1.2.X 运行的 Google App Engine 网络应用。在 Google 更改了对使用 Java 7 构建的 Web 应用程序的要求后,我一直在代
我在启动方法时不断收到错误,将一些对象从服务器返回到 ExtJs。我是 JavaEE 的新手,我想我在某个地方犯了错误。 这是来自 JBossDevStudio 控制台的日志: 11:04:37,21
升级到 JDK 1.7 后出现以下异常: java.lang.VerifyError: Expecting a stackmap frame at branch target 71 in method
我是一名优秀的程序员,十分优秀!