Fangrui Song via llvm-dev
2020-Jun-02 15:36 UTC
[llvm-dev] LLD : __start_ and __end_ symbols for orphan sections
On 2020-06-02, Moshtaghi, Alireza wrote:>Sorry for the cryptic code but I had to modify stuff from original >In the following example see the difference when you comment or uncomment the line in the linker script: >============ test.c ============= : >struct orphan_dummy_anno_s { > void (*func)(void); >}; > >static void dummy_export_dbg_log_init_f (void) __attribute__ ((unused)); >static struct orphan_dummy_anno_s const > dummy_export_dbg_log_init_linker_set > { dummy_export_dbg_log_init_f, }; >__asm__ (".globl " "__start_set_orphan_dummy_anno"); >__asm__ (".globl " "__stop_set_orphan_dummy_anno"); >static void const > *__set_orphan_dummy_anno_sym_dummy_export_dbg_log_init_linker_set > __attribute__ ((__section__ ("set_" "orphan_dummy_anno"))) > __attribute__ ((__used__)) = &dummy_export_dbg_log_init_linker_set; >============ linker_script ============= : >SECTIONS { > data : { *(data) } ># when commented, the __start and __stop symbols will be protected. How can I keep it from setting it as protected? ># set_orphan_dummy_anno : { PROVIDE(__start_set_orphan_dummy_anno = . ); *(set_orphan_dummy_anno) PROVIDE (__stop_set_orphan_dummy_anno = . );} >} >============ howto ============= : >LDFLAGS="-Bshareable -T ./linker_script" >clang -fPIC -c test.c >ld.lld $LDFLAGS test.o -o test.so >objdump -tT test.soMaking __start_* __stop_* STV_PROTECTED is a deliberate choice. See https://reviews.llvm.org/D44566 Such symbols can still be exported to .dynsym (can be looked up from another shared object with dlopen) but prevent accidental symbol preemption..> >On 6/2/20, 12:00 AM, "llvm-dev on behalf of Moshtaghi, Alireza via llvm-dev" <llvm-dev-bounces at lists.llvm.org on behalf of llvm-dev at lists.llvm.org> wrote: > > NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe. > > > > > You are right it creates them but sets the protected flag (STV_PROTECTED) which seems to be the cause of my problem. > How can I tell it to set the flag as STV_DEFAULT? > > Thanks > A > > On 5/28/20, 11:30 PM, "Fangrui Song" <maskray at google.com> wrote: > > NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe. > > > > > On 2020-05-28, Moshtaghi, Alireza via llvm-dev wrote: > >lld does not seem to create the __start and __end symbols for orphan sections. > >I would like to keep my linker script as generic as possible so how can I tell lld to create these symbols without having to add them in the linker script? > > > >Thanks > >A > > It works for me. > > SECTIONS { > data : { *(data) } > } > > .section data,"aw" > .quad __start_orphan > .quad __stop_orphan > > .section orphan,"aw" > .quad __start_data > .quad __stop_data > > > Can you give an example __start_ or __end_ symbols are not defined for orphan sections? > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >
Moshtaghi, Alireza via llvm-dev
2020-Jun-02 17:05 UTC
[llvm-dev] LLD : __start_ and __end_ symbols for orphan sections
Okay Thank you On 6/2/20, 8:37 AM, "Fangrui Song" <maskray at google.com> wrote: NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe. On 2020-06-02, Moshtaghi, Alireza wrote: >Sorry for the cryptic code but I had to modify stuff from original >In the following example see the difference when you comment or uncomment the line in the linker script: >============ test.c ============= : >struct orphan_dummy_anno_s { > void (*func)(void); >}; > >static void dummy_export_dbg_log_init_f (void) __attribute__ ((unused)); >static struct orphan_dummy_anno_s const > dummy_export_dbg_log_init_linker_set > { dummy_export_dbg_log_init_f, }; >__asm__ (".globl " "__start_set_orphan_dummy_anno"); >__asm__ (".globl " "__stop_set_orphan_dummy_anno"); >static void const > *__set_orphan_dummy_anno_sym_dummy_export_dbg_log_init_linker_set > __attribute__ ((__section__ ("set_" "orphan_dummy_anno"))) > __attribute__ ((__used__)) = &dummy_export_dbg_log_init_linker_set; >============ linker_script ============= : >SECTIONS { > data : { *(data) } ># when commented, the __start and __stop symbols will be protected. How can I keep it from setting it as protected? ># set_orphan_dummy_anno : { PROVIDE(__start_set_orphan_dummy_anno = . ); *(set_orphan_dummy_anno) PROVIDE (__stop_set_orphan_dummy_anno = . );} >} >============ howto ============= : >LDFLAGS="-Bshareable -T ./linker_script" >clang -fPIC -c test.c >ld.lld $LDFLAGS test.o -o test.so >objdump -tT test.so Making __start_* __stop_* STV_PROTECTED is a deliberate choice. See https://reviews.llvm.org/D44566 Such symbols can still be exported to .dynsym (can be looked up from another shared object with dlopen) but prevent accidental symbol preemption.. > >On 6/2/20, 12:00 AM, "llvm-dev on behalf of Moshtaghi, Alireza via llvm-dev" <llvm-dev-bounces at lists.llvm.org on behalf of llvm-dev at lists.llvm.org> wrote: > > NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe. > > > > > You are right it creates them but sets the protected flag (STV_PROTECTED) which seems to be the cause of my problem. > How can I tell it to set the flag as STV_DEFAULT? > > Thanks > A > > On 5/28/20, 11:30 PM, "Fangrui Song" <maskray at google.com> wrote: > > NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe. > > > > > On 2020-05-28, Moshtaghi, Alireza via llvm-dev wrote: > >lld does not seem to create the __start and __end symbols for orphan sections. > >I would like to keep my linker script as generic as possible so how can I tell lld to create these symbols without having to add them in the linker script? > > > >Thanks > >A > > It works for me. > > SECTIONS { > data : { *(data) } > } > > .section data,"aw" > .quad __start_orphan > .quad __stop_orphan > > .section orphan,"aw" > .quad __start_data > .quad __stop_data > > > Can you give an example __start_ or __end_ symbols are not defined for orphan sections? > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >
Petr Hosek via llvm-dev
2020-Jun-02 19:59 UTC
[llvm-dev] LLD : __start_ and __end_ symbols for orphan sections
In our case, we'd prefer the opposite that is for __start/__stop symbols to be always hidden (which is something Rafael also pointed out in https://reviews.llvm.org/D44566#1041984), currently this also requires a linker script on our side which is unfortunate. I have created a change https://reviews.llvm.org/D55682 to provide the -z hidden-start-stop-symbol but this was rejected. I'm wondering if it'd make sense to extend that change to instead provide -z start-stop-symbol-visibility= which could be used to override visibility for __start/__stop symbol (i.e. default or hidden) which would match the frontend -fvisibility= flag. Would that be acceptable? On Tue, Jun 2, 2020 at 10:05 AM Moshtaghi, Alireza via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Okay > Thank you > > On 6/2/20, 8:37 AM, "Fangrui Song" <maskray at google.com> wrote: > > NetApp Security WARNING: This is an external email. Do not click links > or open attachments unless you recognize the sender and know the content is > safe. > > > > > On 2020-06-02, Moshtaghi, Alireza wrote: > >Sorry for the cryptic code but I had to modify stuff from original > >In the following example see the difference when you comment or > uncomment the line in the linker script: > >============ test.c ============= : > >struct orphan_dummy_anno_s { > > void (*func)(void); > >}; > > > >static void dummy_export_dbg_log_init_f (void) __attribute__ > ((unused)); > >static struct orphan_dummy_anno_s const > > dummy_export_dbg_log_init_linker_set > > { dummy_export_dbg_log_init_f, }; > >__asm__ (".globl " "__start_set_orphan_dummy_anno"); > >__asm__ (".globl " "__stop_set_orphan_dummy_anno"); > >static void const > > *__set_orphan_dummy_anno_sym_dummy_export_dbg_log_init_linker_set > > __attribute__ ((__section__ ("set_" "orphan_dummy_anno"))) > > __attribute__ ((__used__)) = &dummy_export_dbg_log_init_linker_set; > >============ linker_script ============= : > >SECTIONS { > > data : { *(data) } > ># when commented, the __start and __stop symbols will be protected. > How can I keep it from setting it as protected? > ># set_orphan_dummy_anno : { PROVIDE(__start_set_orphan_dummy_anno > . ); *(set_orphan_dummy_anno) PROVIDE (__stop_set_orphan_dummy_anno = . );} > >} > >============ howto ============= : > >LDFLAGS="-Bshareable -T ./linker_script" > >clang -fPIC -c test.c > >ld.lld $LDFLAGS test.o -o test.so > >objdump -tT test.so > > Making __start_* __stop_* STV_PROTECTED is a deliberate choice. See > https://reviews.llvm.org/D44566 > Such symbols can still be exported to .dynsym (can be looked up from > another shared object with dlopen) but prevent accidental symbol > preemption.. > > > >On 6/2/20, 12:00 AM, "llvm-dev on behalf of Moshtaghi, Alireza via > llvm-dev" <llvm-dev-bounces at lists.llvm.org on behalf of > llvm-dev at lists.llvm.org> wrote: > > > > NetApp Security WARNING: This is an external email. Do not click > links or open attachments unless you recognize the sender and know the > content is safe. > > > > > > > > > > You are right it creates them but sets the protected flag > (STV_PROTECTED) which seems to be the cause of my problem. > > How can I tell it to set the flag as STV_DEFAULT? > > > > Thanks > > A > > > > On 5/28/20, 11:30 PM, "Fangrui Song" <maskray at google.com> wrote: > > > > NetApp Security WARNING: This is an external email. Do not > click links or open attachments unless you recognize the sender and know > the content is safe. > > > > > > > > > > On 2020-05-28, Moshtaghi, Alireza via llvm-dev wrote: > > >lld does not seem to create the __start and __end symbols > for orphan sections. > > >I would like to keep my linker script as generic as possible > so how can I tell lld to create these symbols without having to add them in > the linker script? > > > > > >Thanks > > >A > > > > It works for me. > > > > SECTIONS { > > data : { *(data) } > > } > > > > .section data,"aw" > > .quad __start_orphan > > .quad __stop_orphan > > > > .section orphan,"aw" > > .quad __start_data > > .quad __stop_data > > > > > > Can you give an example __start_ or __end_ symbols are not > defined for orphan sections? > > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200602/f0d64073/attachment.html>