llvm-project/lld/test/LinkerScript/linker-script.test
Rafael Auler 347fb02093 [lld] Teach LLD how to parse most linker scripts
This patch does *not* implement any semantic actions, but it is a first step to
teach LLD how to read complete linker scripts. The additional linker scripts
statements whose parsing is now supported are:

* SEARCH_DIR directive
* SECTIONS directive
* Symbol definitions inside SECTIONS including PROVIDE and PROVIDE_HIDDEN
* C-like expressions used in many places in linker scripts
* Input to output sections mapping

The goal of this commit was guided towards completely parsing a default GNU ld
linker script and the linker script used to link the FreeBSD kernel. Thus, it
also adds a test case based on the default linker script used in GNU ld for
x86_64 ELF targets. I tested SPEC userland programs linked by GNU ld, using the
linker script dump'ed by this parser, and everything went fine. I then tested
linking the FreeBSD kernel with a dump'ed linker script, installed the new
kernel and booted it, everything went fine.

Directives that still need to be implemented:
* MEMORY
* PHDRS

Reviewers: silvas, shankarke and ruiu

http://reviews.llvm.org/D5852

llvm-svn: 221126
2014-11-03 04:09:51 +00:00

42 lines
1.3 KiB
Plaintext

/* RUN: linker-script-test %s | FileCheck %s
*/
OUTPUT_ARCH(i386:x86_64)
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) -lm -l:libgcc.a )
ENTRY(init)
/*
CHECK: kw_output_arch: OUTPUT_ARCH
CHECK: l_paren: (
CHECK: identifier: i386:x86_64
CHECK: r_paren: )
CHECK: kw_output_format: OUTPUT_FORMAT
CHECK: l_paren: (
CHECK: identifier: elf64-x86-64
CHECK: comma: ,
CHECK: identifier: elf64-x86-64
CHECK: comma: ,
CHECK: identifier: elf64-x86-64
CHECK: r_paren: )
CHECK: kw_group: GROUP
CHECK: l_paren: (
CHECK: identifier: /lib/x86_64-linux-gnu/libc.so.6
CHECK: identifier: /usr/lib/x86_64-linux-gnu/libc_nonshared.a
CHECK: kw_as_needed: AS_NEEDED
CHECK: l_paren: (
CHECK: identifier: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
CHECK: r_paren: )
CHECK: libname: m
CHECK: libname: :libgcc.a
CHECK: r_paren: )
CHECK: kw_entry: ENTRY
CHECK: l_paren: (
CHECK: identifier: init
CHECK: r_paren: )
CHECK: eof:
CHECK: OUTPUT_FORMAT("elf64-x86-64","elf64-x86-64","elf64-x86-64")
CHECK: GROUP(/lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a AS_NEEDED(/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2) -lm -l:libgcc.a)
CHECK: ENTRY(init)
*/