This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Define __start/__stop symbols when there is only a dynamic def
Hi,
On Mon, 29 Jan 2018, H.J. Lu wrote:
> > % cat app.c
> > #define _GNU_SOURCE
> > #include <stdlib.h>
> > #include <stdio.h>
> > #include <dlfcn.h>
> >
> > extern int __start___verbose[];
> > extern int __stop___verbose[];
> > int bar (void)
> > {
> > static int my_var __attribute__((section("__verbose"))) = 6;
> > int *ptr;
> > ptr = (int*) dlsym(RTLD_DEFAULT, "__start___verbose");
> > if (!ptr || *ptr != 6)
> > return -1;
> > return 0;
> > }
> >
> > int main()
> > {
> > if (bar () != 0)
> > {
> > printf("main: wrong __start___verbose\n");
> > exit(2);
> > }
> > return 0;
> > }
>
> Just to verify. This is the correct testcase:
>
> [hjl@gnu-6 orphan-4]$ cat app.c
> #define _GNU_SOURCE
> #include <stdio.h>
> #include <dlfcn.h>
>
> extern int __start___verbose[];
> extern int __stop___verbose[];
> int bar (void)
> {
> static int my_var __attribute__((section("__verbose"))) = 6;
> int *ptr;
> ptr = (int*) dlsym(RTLD_DEFAULT, "__start___verbose");
> if (!ptr || *ptr != 6)
> return -1;
> return 0;
> }
>
> int main()
> {
> if (bar () != 0)
> {
> printf("main: wrong __start___verbose\n");
> return 2;
> }
> return 0;
> }
> [hjl@gnu-6 orphan-4]$ make
> cc -g -c -o app.o app.c
> cc -B./ -o app app.o -ldl -Wl,-R,.
> ./app
> main: wrong __start___verbose
> make: *** [Makefile:6: all] Error 2
> [hjl@gnu-6 orphan-4]$
Yes, that's it. (the associated lib.c needs to have a regular ref symbol
to __start___symbol and that lib needs to have something else than "6" in
its __verbose section, in order to test the exact situation of pacemaker).
With the patch from Alan ./app will have __start___verbose in its symbol
table, but not yet in the dynamic symbol table. So with only Alans patch
-E would be necessary. With the addition of the
bfd_elf_link_record_dynamic_symbol() call to bfd_elf_define_start_stop the
above testcase will start working as is even without -E.
Ciao,
Michael.