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

标签 c linker llvm undefined-symbol

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

相关文章:

gcc - Address Sanitizer 可以在检测到错误后立即中止吗?

c - 查找数组中输入数字的中位数

c - 变量的初始化

c++ - 如何定义和测试字符串值的宏?

c - 在链接时找出外部变量的位置

llvm:从 "call"指令获取函数

c - Internet Checksum 函数是否移动 8bits

compiler-construction - 如何链接两个nasm源文件

gcc - 为什么有些图书馆打不开?

c++ - 如何插入 LLVM 指令?