GROUP

GROUP(files)
GROUP(file0 file1 file2 ...)

指定需要重复搜索符号定义的多个输入文件。file 必须是库文件,且 file 文件作为一 组被 ld 重复扫描,直到不在有新的未定义的引用出现。

e.g. 三个源文件 DemoA.c,DemoC.c 和 DemoB.c,其中 DemoB.c 引用 DemoA.c 和 DemoC.c 里面的函数,使用 GCC 生成独立的目标文件 DemoB.o,然后将 DemoA.c 和 DemoC.c 生成动态库 libDemoA.so 和 libDemoC.so。 ld 使用链接脚本 Demo.lds, 并且 在 Demo.lds 里面使用 GROUP 关键字扫描 libDemoA.so 和 libDemoC.so:

DemoA.c

int out(int a, int b)
{
    reutrn a + b;
}

DemoB.c

extern int out(int a, int b);
extern int in(int a, int b);

int nomain(void)
{
    out(2, 3);
    in(2, 3);
    return 0;
}

DemoC.c

int in(int a, int b)
{
    return a - b;
}

Demo.lds

ENTRY(nomain)
GROUP(libDemoA.so libDemoC.so)

SECTIONS
{
    . = 0x08048000 + SIZEOF_HEADERS;

    Demotext { *(.text) *(.data) *(.rodata) }
}

使用如下命令进行编译和链接:

gcc -shared -fPIC demoA.c -o libDemoA.so
gcc -shared -fPIC demoC.c -o libDemoC.so
gcc demoB.c -c
ld -T Demo.lds demoB.o -o a.out

链接成功之后生成 a.out 可执行文件,使用 objdump 工具查看 a.out 的 ELF 文件布局:

objdump -sSdhx a.out

附录

BiscuitOS Home

BiscuitOS Driver

BiscuitOS Kernel Build

Linux Kernel

Bootlin: Elixir Cross Referencer

赞赏一下吧 🙂

MMU