Messages in this thread | | | From | Arvind Sankar <> | Date | Tue, 25 Feb 2020 11:42:59 -0500 | Subject | Re: --orphan-handling=warn |
| |
On Mon, Feb 24, 2020 at 09:35:04PM -0800, Kees Cook wrote: > On Sat, Feb 22, 2020 at 03:20:39PM -0800, Nick Desaulniers wrote: > > Kees is working on a series to just be explicit about what sections > > are ordered where, and what's discarded, which should better handle > > incompatibilities between linkers in regards to orphan section > > placement and "what does `*` mean." Kees, that series can't come soon > > So, with my series[1] applied, ld.bfd builds clean. With ld.lld, I get a > TON of warnings, such as: > > (.bss.rel.ro) is being placed in '.bss.rel.ro' > (.iplt) is being placed in '.iplt' > (.plt) is being placed in '.plt' > (.rela.altinstr_aux) is being placed in '.rela.altinstr_aux' > (.rela.altinstr_replacement) is being placed in > '.rela.altinstr_replacement' > (.rela.altinstructions) is being placed in '.rela.altinstructions' > (.rela.apicdrivers) is being placed in '.rela.apicdrivers' > (.rela__bug_table) is being placed in '.rela__bug_table' > (.rela.con_initcall.init) is being placed in '.rela.init.data' > (.rela.cpuidle.text) is being placed in '.rela.text' > (.rela.data..cacheline_aligned) is being placed in '.rela.data' > (.rela.data) is being placed in '.rela.data' > (.rela.data..percpu) is being placed in '.rela.data..percpu' > (.rela.data..percpu..page_aligned) is being placed in '.rela.data..percpu' > ... > > But as you can see in the /DISCARD/, these (and all the others), should > be getting caught: > > /DISCARD/ : { > *(.eh_frame) > + *(.rela.*) *(.rela_*) > + *(.rel.*) *(.rel_*) > + *(.got) *(.got.*) > + *(.igot.*) *(.iplt) > } > > I don't understand what's happening here. I haven't minimized this case > nor opened an lld bug yet. >
At least for the relocation sections, they cannot actually be discarded because we build vmlinux with --emit-relocs (at least for x86).
However, attempting to collect them via for eg .rela.all : { *(.rela.*) } while using --emit-relocs works for neither ld.bfd nor ld.lld, just like discarding doesn't work. The original .rela.<section_name> sections are always output. ld.bfd doesn't warn, but ld.lld warns that these are all orphan sections. I think these warnings would have to be suppressed to make --orphan-handling=warn useful with --emit-relocs.
It seems like lld needs even .symtab, .strtab and .shstrtab (and .symtab_shndx -- not sure what this is as it doesn't actually appear in output) to be explicitly in the linker script to avoid warning about them. Maybe these should be suppressed as well?
For .plt I think you just forgot to discard it. I didn't actually get a warning for iplt, and the one for plt goes away if you do add it to discards.
Not sure why there's a .bss.rel.ro section in the first place -- surely the bss can't have any relocations? But that can be removed via discard as well at least.
| |