如何在 clang llvm LTO 创建的目标文件中重新定义符号?似乎是“LLVM IR bitcode”文件

问题描述 投票:0回答:1

有一个旧项目需要在构建过程中重新定义符号。我想启用-flto,但现在似乎无法重新定义符号。

echo "int foo(){return 0;}" > foo.c

clang -c foo.c
llvm-objcopy --redefine-sym foo=bar foo.o
file foo.o
#> foo.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

clang -flto -c foo.c
llvm-objcopy --redefine-sym foo=bar foo.o
#> llvm-objcopy: error: 'foo.o': The file was not recognized as a valid object file
file foo.o
#> foo.o: LLVM IR bitcode

或者,我可以通过其他方式解决问题吗?我需要的是

clang -o abc abc.c foo.o
但让
abc.c
中的函数调用解决以纠正
foo.o
中的函数。

环境信息:

root@codespaces-251304:/bind# clang --version
Ubuntu clang version 19.1.0 (++20240815083225+4d4a4100f68d-1~exp1~20240815083357.22)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-19/bin

root@codespaces-251304:/bind# llvm-objcopy --version
llvm-objcopy, compatible with GNU objcopy
Ubuntu LLVM version 19.1.0
  Optimized build.
clang llvm llvm-ir lto
1个回答
0
投票

几小时后我找到了解决方案,使用

llvm-dls
llvm-as
.

rename_function(){
  llvm-dis $3 -o - | sed -e "s|name: \"$1\"|name: \"$2\"|" -e "s|@$1(|@$2(|" | llvm-as -o $3.m.o
  mv $3.m.o $3
}
rename_function bar foo foo.o
© www.soinside.com 2019 - 2024. All rights reserved.