gpt4 book ai didi

c - 如何将 C 声明链接到非标准部分中的符号?

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:00 24 4
gpt4 key购买 nike

我正在尝试使用 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.cclang 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com