<div dir="ltr"><div><div><div><div>Hi,<br></div><br></div>I've wrote a test, which is modified from lld/test/elf/linkerscript/sections-with-wildcards.tes.<br><br>Index: tools/lld/test/elf/linkerscript/filename-with-wildcards.test<br><+>UTF-8<br>===================================================================<br>--- tools/lld/test/elf/linkerscript/filename-with-wildcards.test    (revision )<br>+++ tools/lld/test/elf/linkerscript/filename-with-wildcards.test    (revision )<br>@@ -0,0 +1,49 @@<br>+/*<br>+Tests a linker script that uses the SECTIONS command with rules containing<br>+wildcards that matching input object files.<br>+*/<br>+<br>+ENTRY(_start)<br>+<br>+SECTIONS<br>+{<br>+  . = 0x500000;<br>+  .foo : { *p1.o(.text .rodata*) }<br>+  .bar : { *(.text .rodata*) }<br>+}<br>+<br>+/*<br>+RUN: mkdir -p %T<br>+RUN: yaml2obj -format=elf %p/Inputs/prog1.o.yaml -o=%T/p1.o<br>+RUN: yaml2obj -format=elf %p/Inputs/prog2.o.yaml -o=%T/p2.o<br>+RUN: yaml2obj -format=elf %p/Inputs/prog3.o.yaml -o=%T/p3.o<br>+RUN: cd %T<br>+<br>+RUN: lld -flavor gnu  -target x86_64 -T %s p1.o p2.o p3.o \<br>+RUN:   -static -o %t1<br>+RUN: llvm-readobj -s %t1 | FileCheck -check-prefix CHECKSECTIONS %s<br>+<br>+CHECKSECTIONS:       Index: 1<br>+CHECKSECTIONS:       Name: .foo<br>+CHECKSECTIONS:       Address: 0x500000<br>+CHECKSECTIONS:       Size: 33<br>+<br>+CHECKSECTIONS:       Index: 2<br>+CHECKSECTIONS:       Name: .bar<br>+CHECKSECTIONS:       Address: 0x500030<br>+CHECKSECTIONS:       Size: 52<br>+<br>+RUN: llvm-readobj -symbols %t1 | FileCheck -check-prefix CHECKSYMS %s<br>+<br>+CHECKSYMS:      Name: main<br>+CHECKSYMS-NEXT: Value: 0x500000<br>+<br>+CHECKSYMS:      Name: prog2<br>+CHECKSYMS-NEXT: Value: 0x500030<br>+<br>+CHECKSYMS:      Name: write<br>+CHECKSYMS-NEXT: Value: 0x500040<br>+<br>+CHECKSYMS:      Name: _start<br>+CHECKSYMS-NEXT: Value: 0x500048<br>+*/<br><br></div>Cheers,<br></div>Huang<br> </div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Aug 22, 2015 at 8:17 AM, Rafael Auler <span dir="ltr"><<a href="mailto:rafaelauler@gmail.com" target="_blank">rafaelauler@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Thanks for your patch, Huang. It looks good to me. Just one comment:<br>
can you write a testcase, similar to the others used for linker script<br>
testing, with your example? Alternatively, you can modify<br>
lld/test/elf/linkerscript/sections-with-wildcards.test to test your<br>
case. This will make your patch complete and ready for commit, and<br>
will ensure we do not regress on this bug if this code is ever<br>
rewritten.<br>
<br>
Best regards,<br>
Rafael Auler<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Aug 21, 2015 at 8:48 PM, Davide Italiano <<a href="mailto:davide@freebsd.org">davide@freebsd.org</a>> wrote:<br>
> On Fri, Aug 21, 2015 at 4:41 AM, zan jyu Wong via llvm-dev<br>
> <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
>> Hi,<br>
>><br>
>> I've found a crash in lld when using linker script with wildcard matching.<br>
>> An example linker script:<br>
>><br>
>> INPUT(os/main.o os/foo.o os/startup.o)<br>
>> OUTPUT(k.bin)<br>
>><br>
>> SECTIONS<br>
>> {<br>
>>     . = 0x0<br>
>>     .text : { *startup.o (.text) }<br>
>>     .text.2 : { *(.tex*) }<br>
>> }<br>
>><br>
>> I've wrote up a patch to fix this crash.<br>
>><br>
><br>
> The patch looks good to me.<br>
> CC:ing Rafael and Michael as they wrote large part of the linker script support.<br>
><br>
><br>
>> Index: tools/lld/lib/ReaderWriter/LinkerScript.cpp<br>
>> <+>UTF-8<br>
>> ===================================================================<br>
>> --- tools/lld/lib/ReaderWriter/LinkerScript.cpp    (revision<br>
>> 8570c61c3fce7de2f655a20f8b184efa1bd97c00)<br>
>> +++ tools/lld/lib/ReaderWriter/LinkerScript.cpp    (revision )<br>
>> @@ -2557,7 +2557,7 @@<br>
>>      switch (*j) {<br>
>>      case '*':<br>
>>        while (!wildcardMatch(pattern.drop_front(j - pattern.begin() + 1),<br>
>> -                            name.drop_front(i - name.begin() + 1))) {<br>
>> +                            name.drop_front(i - name.begin()))) {<br>
>>          if (i == name.end())<br>
>>            return false;<br>
>>          ++i;<br>
>> @@ -2565,6 +2565,7 @@<br>
>>        break;<br>
>>      case '?':<br>
>>        // Matches any character<br>
>> +      ++i;<br>
>>        break;<br>
>>      case '[': {<br>
>>        // Matches a range of characters specified between brackets<br>
>> @@ -2577,20 +2578,22 @@<br>
>>          return false;<br>
>><br>
>>        j = pattern.begin() + end;<br>
>> +      ++i;<br>
>>        break;<br>
>>      }<br>
>>      case '\\':<br>
>>        ++j;<br>
>>        if (*j != *i)<br>
>>          return false;<br>
>> +      ++i;<br>
>>        break;<br>
>>      default:<br>
>>        // No wildcard character means we must match exactly the same char<br>
>>        if (*j != *i)<br>
>>          return false;<br>
>> +      ++i;<br>
>>        break;<br>
>>      }<br>
>> -    ++i;<br>
>>    }<br>
>><br>
>>    // If our pattern has't consumed the entire string, it is not a match<br>
>><br>
>> Cheers,<br>
>> Huang<br>
>><br>
>> _______________________________________________<br>
>> LLVM Developers mailing list<br>
>> <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
>><br>
><br>
><br>
><br>
> --<br>
> Davide<br>
><br>
> "There are no solved problems; there are only problems that are more<br>
> or less solved" -- Henri Poincare<br>
</div></div></blockquote></div><br></div>