[llvm-dev] a lld linker script bug

44 views
Skip to first unread message

zan jyu Wong via llvm-dev

unread,
Aug 21, 2015, 4:42:06 AM8/21/15
to llvm...@lists.llvm.org
Hi,

I've found a crash in lld when using linker script with wildcard matching.
An example linker script:

INPUT(os/main.o os/foo.o os/startup.o)
OUTPUT(k.bin)

SECTIONS
{
    . = 0x0
    .text : { *startup.o (.text) }
    .text.2 : { *(.tex*) }
}

I've wrote up a patch to fix this crash.

Index: tools/lld/lib/ReaderWriter/LinkerScript.cpp
<+>UTF-8
===================================================================
--- tools/lld/lib/ReaderWriter/LinkerScript.cpp    (revision 8570c61c3fce7de2f655a20f8b184efa1bd97c00)
+++ tools/lld/lib/ReaderWriter/LinkerScript.cpp    (revision )
@@ -2557,7 +2557,7 @@
     switch (*j) {
     case '*':
       while (!wildcardMatch(pattern.drop_front(j - pattern.begin() + 1),
-                            name.drop_front(i - name.begin() + 1))) {
+                            name.drop_front(i - name.begin()))) {
         if (i == name.end())
           return false;
         ++i;
@@ -2565,6 +2565,7 @@
       break;
     case '?':
       // Matches any character
+      ++i;
       break;
     case '[': {
       // Matches a range of characters specified between brackets
@@ -2577,20 +2578,22 @@
         return false;
 
       j = pattern.begin() + end;
+      ++i;
       break;
     }
     case '\\':
       ++j;
       if (*j != *i)
         return false;
+      ++i;
       break;
     default:
       // No wildcard character means we must match exactly the same char
       if (*j != *i)
         return false;
+      ++i;
       break;
     }
-    ++i;
   }
 
   // If our pattern has't consumed the entire string, it is not a match

Cheers,
Huang

Davide Italiano via llvm-dev

unread,
Aug 21, 2015, 7:48:24 PM8/21/15
to zan jyu Wong, Rafael Auler, Michael Spencer, llvm...@lists.llvm.org
On Fri, Aug 21, 2015 at 4:41 AM, zan jyu Wong via llvm-dev
<llvm...@lists.llvm.org> wrote:
> Hi,
>
> I've found a crash in lld when using linker script with wildcard matching.
> An example linker script:
>
> INPUT(os/main.o os/foo.o os/startup.o)
> OUTPUT(k.bin)
>
> SECTIONS
> {
> . = 0x0
> .text : { *startup.o (.text) }
> .text.2 : { *(.tex*) }
> }
>
> I've wrote up a patch to fix this crash.
>

The patch looks good to me.
CC:ing Rafael and Michael as they wrote large part of the linker script support.

> _______________________________________________
> LLVM Developers mailing list
> llvm...@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>

--
Davide

"There are no solved problems; there are only problems that are more
or less solved" -- Henri Poincare
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Rafael Auler via llvm-dev

unread,
Aug 21, 2015, 8:17:15 PM8/21/15
to Davide Italiano, llvm...@lists.llvm.org
Hi,

Thanks for your patch, Huang. It looks good to me. Just one comment:
can you write a testcase, similar to the others used for linker script
testing, with your example? Alternatively, you can modify
lld/test/elf/linkerscript/sections-with-wildcards.test to test your
case. This will make your patch complete and ready for commit, and
will ensure we do not regress on this bug if this code is ever
rewritten.

Best regards,
Rafael Auler

zan jyu Wong via llvm-dev

unread,
Aug 22, 2015, 3:13:31 AM8/22/15
to Rafael Auler, llvm...@lists.llvm.org
Hi,

I've wrote a test, which is modified from lld/test/elf/linkerscript/sections-with-wildcards.tes.

Index: tools/lld/test/elf/linkerscript/filename-with-wildcards.test
<+>UTF-8
===================================================================
--- tools/lld/test/elf/linkerscript/filename-with-wildcards.test    (revision )
+++ tools/lld/test/elf/linkerscript/filename-with-wildcards.test    (revision )
@@ -0,0 +1,49 @@
+/*
+Tests a linker script that uses the SECTIONS command with rules containing
+wildcards that matching input object files.
+*/
+
+ENTRY(_start)
+
+SECTIONS
+{
+  . = 0x500000;
+  .foo : { *p1.o(.text .rodata*) }
+  .bar : { *(.text .rodata*) }
+}
+
+/*
+RUN: mkdir -p %T
+RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1.o
+RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2.o
+RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3.o
+RUN: cd %T
+
+RUN: lld -flavor gnu  -target x86_64 -T %s p1.o p2.o p3.o \
+RUN:   -static -o %t1
+RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s
+
+CHECKSECTIONS:       Index: 1
+CHECKSECTIONS:       Name: .foo
+CHECKSECTIONS:       Address: 0x500000
+CHECKSECTIONS:       Size: 33
+
+CHECKSECTIONS:       Index: 2
+CHECKSECTIONS:       Name: .bar
+CHECKSECTIONS:       Address: 0x500030
+CHECKSECTIONS:       Size: 52
+
+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s
+
+CHECKSYMS:      Name: main
+CHECKSYMS-NEXT: Value: 0x500000
+
+CHECKSYMS:      Name: prog2
+CHECKSYMS-NEXT: Value: 0x500030
+
+CHECKSYMS:      Name: write
+CHECKSYMS-NEXT: Value: 0x500040
+
+CHECKSYMS:      Name: _start
+CHECKSYMS-NEXT: Value: 0x500048
+*/

Cheers,
Huang

Davide Italiano via llvm-dev

unread,
Aug 22, 2015, 4:38:07 PM8/22/15
to zan jyu Wong, llvm...@lists.llvm.org
On Sat, Aug 22, 2015 at 3:13 AM, zan jyu Wong via llvm-dev

I committed the patch and the test as r245792.
Thank you for your contribution.

Reply all
Reply to author
Forward
0 new messages