Define __start/__stop symbols when there is only a dynamic def

H.J. Lu hjl.tools@gmail.com
Mon Jan 29 13:53:00 GMT 2018


On Mon, Jan 29, 2018 at 3:20 AM, Alan Modra <amodra@gmail.com> wrote:
> On Fri, Jan 26, 2018 at 06:07:20PM -0800, H.J. Lu wrote:
>> testsuite/ld-elf/pr21964-1a.c  testsuite/ld-elf/pr21964-2a.c
>> testsuite/ld-elf/pr21964-1b.c  testsuite/ld-elf/pr21964-2b.c
>> testsuite/ld-elf/pr21964-1c.c  testsuite/ld-elf/pr21964-2c.c
>>
>> in binutils source tree?  They pass without Alan's patch.
>
> Another __start/__stop testcase.  It's probably a bug that the test
> needs -E.

Yes, it looks very odd.  I thought the issue was with the  __start/__stop
symbols in the shared object, not with executable.  Why is -E needed?
I don't want to second guess.  Michael, can you provide a testcase to
show your use case?

Thanks.

>         * testsuite/ld-elf/pr21964-3a.c: New file.
>         * testsuite/ld-elf/pr21964-3c.c: New file.
>         * testsuite/ld-elf/shared.exp: Run new __start/__stop testcase.
>
> diff --git a/ld/testsuite/ld-elf/pr21964-3a.c b/ld/testsuite/ld-elf/pr21964-3a.c
> new file mode 100644
> index 0000000..835040e
> --- /dev/null
> +++ b/ld/testsuite/ld-elf/pr21964-3a.c
> @@ -0,0 +1,11 @@
> +extern int __start___verbose[];
> +extern int __stop___verbose[];
> +int
> +foo3 (void)
> +{
> +  if (__start___verbose == __stop___verbose
> +      || __start___verbose[0] != 6)
> +    return -1;
> +  else
> +    return 0;
> +}
> diff --git a/ld/testsuite/ld-elf/pr21964-3c.c b/ld/testsuite/ld-elf/pr21964-3c.c
> new file mode 100644
> index 0000000..5b750d1
> --- /dev/null
> +++ b/ld/testsuite/ld-elf/pr21964-3c.c
> @@ -0,0 +1,17 @@
> +#include <stdio.h>
> +
> +extern int foo1 (void);
> +extern int foo2 (void);
> +extern int foo3 (void);
> +
> +static int my_var __attribute__((used, section("__verbose"))) = 6;
> +
> +int
> +main ()
> +{
> +  if (foo1 () == 0
> +      && foo2 () == 0
> +      && foo3 () == 0)
> +    printf ("PASS\n");
> +  return 0;
> +}
> diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp
> index 5c4d78a..e4729ce 100644
> --- a/ld/testsuite/ld-elf/shared.exp
> +++ b/ld/testsuite/ld-elf/shared.exp
> @@ -565,6 +565,9 @@ set build_tests {
>    {"Build pr21964-2b.so"
>     "-shared" "-fPIC"
>     {pr21964-2b.c} {} "pr21964-2b.so"}
> +  {"Build pr21964-3a.so"
> +   "-shared" "-fPIC"
> +   {pr21964-3a.c} {} "pr21964-3a.so"}
>    {"Dump pr21978.so"
>     "-shared" "-fPIC -g -O2"
>     {pr21978a.c pr21978b.c} {{objdump {-Sl} pr21978.od}} "pr21978.so"}
> @@ -701,6 +704,9 @@ set run_tests [list \
>      [list "Run pr21964-1" \
>       "-Wl,--no-as-needed,-rpath,tmpdir tmpdir/pr21964-1a.so tmpdir/pr21964-1b.so" "" \
>       {pr21964-1c.c} "pr21964-1" "pass.out" ] \
> +    [list "Run pr21964-3" \
> +     "-Wl,--no-as-needed,-rpath,tmpdir,-E tmpdir/pr21964-1a.so tmpdir/pr21964-1b.so tmpdir/pr21964-3a.so" "" \
> +     {pr21964-3c.c} "pr21964-3" "pass.out" ] \
>  ]
>
>  # NetBSD ELF systems do not currently support the .*_array sections.


-- 
H.J.



More information about the Binutils mailing list