【发布时间】:2019-05-10 10:21:33
【问题描述】:
我想定义一个程序使用的外部全局符号(const char*)。在链接时添加具有给定值的符号。这对于例如提交哈希或构建时间很有用。
我发现--defsym 做了别的事情。 Go 链接器通过 -X 选项支持此功能。 (是的,我知道,Go 字符串是托管的,但我说的是普通的旧零终止 c 字符串)
例如:
extern const char *git_commit;
int main(int argc, char *argv[]) {
puts(git_commit);
return 0;
}
gcc main.o -Wl<something here that adds git_commit and set it to '84e5...'>
我知道config.h 方法和构建包含这些字符串的目标文件。但它的2019年知道。这样一个简单的任务应该很容易。
编辑更精确的问题
在 gcc/binutils 中是否有 Go Linker 的 -X 选项的等效选项。
【问题讨论】:
-
如何将字符串放入
config.h并不容易?相比之下,找到符合您要求的链接器参数(包括正确编码)似乎是一场噩梦。 -
不,这很愚蠢。您必须重建使用此
config.h文件的每个文件。由于包括地狱,这可能很多。 Go Linker 支持它是有充分理由的。 -
如果你不想调用编译器或任何东西,你总是可以写一个程序,直接写一个带有合适符号定义的目标文件……
-
我的问题是这是否可能。这里的每个人都在解决不同的问题。我以 git_commit 为例,简单说明结果应该是什么。
-
综上所述,来自 VCS 的工件(SVN 修订版、GIT 哈希等)是一种糟糕的软件版本控制方式。您的软件应该有自己的版本控制,它独立于其源代码的版本控制。