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
42 lines
1.3 KiB
Plaintext
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)
|
|
*/
|