我正在尝试使用 LLVM's stack map intrinsics ,而且我无法弄清楚如何处理从 C 程序生成的数据。举一个最小的例子,我有以下文件:
st.ll
:
declare void @llvm.experimental.stackmap(i64, i32, ...)
define i32 @some_func(i32 %x) {
%y = add i32 %x, %x
call void(i64, i32, ...) @llvm.experimental.stackmap(i64 3735928559, i32 0, i32 %x, i32 %y)
ret i32 %y
}
ex.c
:
#include <stdio.h>
extern char __LLVM_StackMaps;
int main(void) {
fwrite(&__LLVM_StackMaps, sizeof(char), 10, stdout);
return 0;
}
如果我运行 clang -c st.ll
然后用 nm -f s st.o
检查生成的目标文件,我得到以下输出:
Symbols from st.o:
Name Value Class Type Size Line Section
__LLVM_StackMaps |0000000000000000| r | NOTYPE| | |.llvm_stackmaps
some_func |0000000000000000| T | FUNC|0000000000000018| |.text
很明显,正在生成一个 __LLVM_StackMaps
符号。但是,如果我运行 clang st.ll ex.c
或 clang st.o ex.c
,我会收到此错误:
/tmp/ex-06d9d2.o: In function `main':
ex.c:(.text+0xb): undefined reference to `__LLVM_StackMaps'
clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
据我所知,问题是符号在 .llvm_stackmaps
部分而不是在 .data
或 中。 bss
.
我该如何解决这个问题?有没有办法在 C 中指定源部分?我可以告诉链接器从 .llvm_stackmaps
部分解析吗?
最佳答案
gnu::section 属性应该可以做到。 clang 显然还支持执行相同操作的 gcc 风格的 attribute((section("...")) 和 msvc 风格的 __declspec(allocate("...")) 语法。
[gnu::section("...")] void my_func(long, long);
关于c - 如何将 C 声明链接到非标准部分中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48346224/