xyz*_*xyz 5 c++ linker gcc compilation
我在这个网站上的第一篇文章抱有很大的希望::我试图通过gcc了解静态链接,动态链接,共享库,静态库等.每当我尝试深入研究这个话题时,我都会有一些我不太了解的东西.
一些实践工作:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个共享库.现在我想将此共享库与我的主程序链接以创建可执行文件.
gcc -Wall -L. main.c -lcgreet -o greet
它非常好用,如果我在运行greet之前设置LD_LIBRARY_PATH(或用rpath选项链接它),我可以使它工作.
然而我的问题是不同的:因为我无论如何都使用共享库,是不是可以在运行时强制符号解析(不确定术语,但可能根据书"链接器和加载器"称为动态链接).我知道我们可能不想这样做,因为这会使程序运行缓慢并且每次我们想要运行程序时都有开销,但我试图理解这一点以清除我的概念.
gcc链接器是否提供了在运行时延迟符号解析的任何选项?(用我们实际上要运行程序的库来实现)(因为在编译时可用的库可能与运行时可用的库不同,如果库中有任何更改)我希望能够做到:
bash $ gcc main.c -I.
(这里需要什么选项?)所以我不必给出库名,只是告诉它我想在运行时进行符号解析,所以标题现在已经足够好了,不需要实际的库名.
谢谢,永远的学习者.
Gia*_*nni 10
任何连接(gcc,ld或任何其他)只解决在编译时链接.这是因为ELF标准(和大多数其他标准一样)没有像你描述的那样定义"运行时"链接.它们要么静态链接(即lib.a),要么在启动时(lib.so,在加载ELF时必须存在).但是,如果使用动态链接,链接器将只在ELF中放入文件的名称和必须找到的符号,它不会直接链接文件.因此,如果您想稍后将lib升级到更新版本,您可以这样做,只要系统可以找到相同的文件名(路径实际上可以是不同的)和相同的符号名称.
在运行时获取符号的另一个选项是使用dlopen,它与gccor 无关ld. dlopen简单地说,打开一个动态链接库,就像fopen可能一样,并返回一个句柄,然后传递给dlsym你想要的符号名称,例如,它可能是一个函数名称. dlsym然后会传递一个指向该符号的指针,然后您可以使用该指针调用该函数或将其用作变量.这就是插件的实现方式.
| 归档时间: |
|
| 查看次数: |
2572 次 |
| 最近记录: |