SEARCH_DIR

SEARCH_DIR(PATH)

定义输入文件的搜索路径。同 ld 的 -L 选项,不过由 -L 指定的路径要比它定义的优先 被收缩到。

e.g. 三个源文件 DemoA.c,DemoB.c 和 DemoC.c,其中 DemoA.c 引用 DemoA.c 和 DemoB.c 里面的函数,使用 GCC 生成独立的目标文件 DemoA.o,DemoB.o 和 DemoC.o。 但 DemoA.o 位于 /tmp/Demo 目录下,DemoB.o 和 DemoC.o 位于 /tmp 目录下。 ld 使 用链接脚本 Demo.lds, 并且在 Demo.lds 里面使用 SEARCH_DIR 关键字指定了搜索目录 为 /tmp,并使用 INPUT 关键字指定 DemoB.o 和 DemoC.o 为输入文件:

DemoA.c

extern void print();
extern void exit();

void nomain()
{
    print();
    exit();
}

DemoB.c

char *str = "Hello World\n";

void print()
{
    __asm__ ("movl $13, %%edx\n\t"
             "movl %0, %%ecx\n\t"
             "movl $0, %%ebx\n\t"
             "movl $4, %%eax\n\r"
             "int $0x80\n\t"
             :: "r" (str) : "edx", "ecx", "ebx");
}

DemoC.c

void exit()
{
    __asm__ ("movl $42, %ebx\n\t"
             "movl $1, %eax\n\t"
             "int $0x80\n\t");
}

Demo.lds

ENTRY(nomain)

SEARCH_DIR(/tmp)
IUPUT(DemoB.o)
INPUT(DemoC.o)

SECTIONS
{
    . = 0x08048000 + SIZEOF_HEADERS;

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

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

gcc DemoA.c -c -o /tmp/DemoA.o
gcc DemoB.c -c -o /tmp/DemoB.o
gcc DemoC.c -c -fno-builtin -o /tmp/DemoC.o
ld -static -T Demo.lds DemoA.o -o a.out

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

objdump -sSdhx a.out

LD

从上面的数据可知,在链接脚本中指定了输入文件的搜索路径之后,输入文件 DemoB.o 和 DemoC.o 能够正确的被找到。因此可以用 SEARCH_DIR 指定输入文件的路径,该关键 字的作用和 ld 的 -L 选项一样,当 -L 选项的优先级更高。

ld -static -T Demo.lds -L/home/buddy DemoC.o -o a.out

附录

BiscuitOS Home

BiscuitOS Driver

BiscuitOS Kernel Build

Linux Kernel

Bootlin: Elixir Cross Referencer

赞赏一下吧 🙂

MMU