我正在成功地编译,使用clang,从源代码到IR比特码,并生成一个静态库。我需要解决的问题是,IR引用了它们的库内部全局名称中的外部全局变量。我需要将这些内部全局名称修改为外部全局名称。例如,在libc.a中,以LLVM格式:
@atoi = alias i32 (i8*), i32 (i8*)* @__GI_atoi
define hidden i32 @__GI_atoi(i8* nonnull) #0 {
...
%4 call i64 @__GI_strtol(i8* %3, i8** null, i32 10) #2
...
}
declare hidden i64 @__GI_strtol(i8*, i8**, i32) #1
__GI_strtol
位于atoi
模块的外部,但在libc.a
存档的内部。strtol
模块有一个@strtol = alias ... @__GI_strtol
定义和一个名为GI_strtol
的hidden
函数。
我需要做的是在编译源文件时(在上面的示例中是atoi.c
),我需要执行以下操作:
.ll
(LLVM)格式。declare hidden
而不是的alias
语句转换为它们的外部全局值(基本上是hidden
--> dso_local
和__GI_*
到*
)。.ll
文件转换为其its (.bc
)等效文件。.bc
文件插入到libc.a
存档中。这个是可能的吗?
我在add_custom_target
文件中有许多CMake和add_custom_command
,但是在从.c
编译到.bc
时没有。
如果这是一个make
构建,我只需添加从.c
编译到.ll
、从.ll
编译到.bc
的定义,并在最后一个阶段执行上述更改。
我希望能够使用CMake以最有效的方式执行上述步骤。我希望能够做到这一点,而不必,字面上说,1000 s的add_custom_command/target
s。
发布于 2019-08-23 04:02:06
我找不到一种方法能够将转换作为编译的一部分。因此,我将add_custom_command
与存档本身上的POST_LINK
一起使用。然后,我处理归档中的每个条目,执行所需的转换,然后更新归档。
它是一种get a bigger hammer
解决方案,但它可以工作,并且不添加100多个自定义目标。
https://stackoverflow.com/questions/57463999
复制相似问题