使用cmake生成静态库时如何有中间编译语句
How to have an intermediate compile statement when generating a static library using cmake
我正在使用 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) 格式。
- 将所有 not 具有关联
alias
语句的 declare hidden
转换为其外部全局值(基本上,hidden
- -> dso_local
和 __GI_*
到 *
).
- 将生成的
.ll
文件转换为等效的 IR 位码 (.bc
)。
- 将
.bc
文件插入 libc.a
存档。
这可能吗?
我在 CMake 文件中有多个 add_custom_target
和 add_custom_command
,但是从 .c
编译到 .bc
时 none。
如果这是一个 make
构建,我会简单地添加定义以从 .c
编译到 .ll
和从 .ll
编译到 .bc
,并且在最后阶段执行上述更改。
我希望能够使用 CMake 以最有效的方式执行上述步骤。我希望能够做到这一点,而不必从字面上看,add_custom_command/target
s.
的 1000s
我找不到能够在编译过程中进行转换的方法。因此,我在存档本身上使用 add_custom_command
和 POST_LINK
。然后我处理存档中的每个条目,进行所需的转换,然后更新存档。
这是一种 get a bigger hammer
解决方案,但它有效并且不会添加 100 多个自定义目标。
我正在使用 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) 格式。 - 将所有 not 具有关联
alias
语句的declare hidden
转换为其外部全局值(基本上,hidden
- ->dso_local
和__GI_*
到*
). - 将生成的
.ll
文件转换为等效的 IR 位码 (.bc
)。 - 将
.bc
文件插入libc.a
存档。
这可能吗?
我在 CMake 文件中有多个 add_custom_target
和 add_custom_command
,但是从 .c
编译到 .bc
时 none。
如果这是一个 make
构建,我会简单地添加定义以从 .c
编译到 .ll
和从 .ll
编译到 .bc
,并且在最后阶段执行上述更改。
我希望能够使用 CMake 以最有效的方式执行上述步骤。我希望能够做到这一点,而不必从字面上看,add_custom_command/target
s.
我找不到能够在编译过程中进行转换的方法。因此,我在存档本身上使用 add_custom_command
和 POST_LINK
。然后我处理存档中的每个条目,进行所需的转换,然后更新存档。
这是一种 get a bigger hammer
解决方案,但它有效并且不会添加 100 多个自定义目标。