我目前正在尝试理解gcc编译器和链接器的工作原理。我接触到了一种称为“链接时替换”的技术,我觉得非常有趣。其目的是在多个文件中具有一个函数的多个定义,并在链接时决定哪个定义进入最终可执行文件。
以下是一个简单的例子:
main.c:
#include "header.h"
int main(void)
{
hello("everyone");
return 0;
}
header.h:
#ifndef _HEADER_H
#define _HEADER_H
void hello(const char * name);
#endif
file1.c:
#include "header.h"
#include <stdio.h>
void hello(const char * name)
{
printf("File1: Hello, %s!\n", name);
}
file2.c:
#include "header.h"
#include <stdio.h>
void hello(const char * name)
{
printf("File2: Hello, %s!\n", name);
}
现在我有两个问题:
- 如果链接器的参数列表中出现所有三个文件,是否可能通过使用适当的链接顺序来选择函数?
- 假设file2.c实现了许多main.c所需的函数。是否可能通过使用链接器将file1.c中的单个函数或一些函数替换为不同的实现(名称相同)? 链接器应首先使用file1.c中的函数定义,然后对于剩余的未解析函数使用file2.c。
谢谢!
_HEADER_H
)在所有作用域中都被“保留”给“实现”(编译器和标准库)。 - Some programmer dude