On 05/04/2018 12:38 PM, Jan Kiszka wrote: > On 2018-05-04 11:12, Ralf Ramsauer wrote: >> On 05/02/2018 06:18 PM, Jan Kiszka wrote: >>> On 2018-05-02 16:51, Ralf Ramsauer wrote: >>>> >>>> >>>> On 05/01/2018 06:54 PM, Jan Kiszka wrote: >>>>> On 2018-05-01 10:54, Ralf Ramsauer wrote: >>>>>> On 04/27/2018 08:21 PM, Jan Kiszka wrote: >>>>>>> On 2018-04-27 11:36, Ralf Ramsauer wrote: >>>>>>>> This won't drop symbols that are marked as used. >>>>>>>> >>>>>>>> The static, relocateable inmate library lib.a is created by ar. When >>>>>>>> linking executables, unreferenced symbols may be dropped, even if they >>>>>>>> are attributed as used. >>>>>>>> >>>>>>>> --whole-archive ensures that those symbols will be linked. >>>>>>>> >>>>>>>> Whereas on x86, we need --gc-sections. >>>>>>> >>>>>>> That's something I do not understand yet: With [1] we will build the >>>>>>> whole hypervisor, including x86, with --whole-archive, and that works >>>>>>> fine on x86 as well. >>>>>> >>>>>> That's what happens if I compile x86 inmates with --whole-archive >>>>>> instead of --gc-sections: >>>>>> >>>>>> LD >>>>>> /home/ralf/workspace/jailhouse/inmates/demos/x86/32-bit-demo-linked.o >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/lib32.a(ioapic-32.o): In >>>>>> function `ioapic_init': >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/ioapic.c:48: undefined >>>>>> reference to `map_range' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/lib32.a(smp-32.o): In >>>>>> function `smp_start_cpu': >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/smp.c:59: undefined >>>>>> reference to `delay_us' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/smp.c:61: undefined >>>>>> reference to `delay_us' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/lib32.a(pci-32.o): In >>>>>> function `pci_find_device': >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/../pci.c:47: undefined >>>>>> reference to `pci_read_config' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/../pci.c:51: undefined >>>>>> reference to `pci_read_config' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/lib32.a(pci-32.o): In >>>>>> function `pci_find_cap': >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/../pci.c:61: undefined >>>>>> reference to `pci_read_config' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/../pci.c:65: undefined >>>>>> reference to `pci_read_config' >>>>>> /home/ralf/workspace/jailhouse/inmates/lib/x86/../pci.c:68: undefined >>>>>> reference to `pci_read_config' >>>>>> >>>>>> Interestingly, this only happens to the 32-bit demo inmate. >>>>>> >>>>> >>>>> Because we keep everything, something might be missing now: The 32-bit >>>>> lib does not provide support for all features that its big 64-bit >>>>> brother has. >>>>> >>>>> I still think this approach is too much of a big hammer. Try >>>>> --print-gc-sections on your specific problem (uart section loss) and >>>>> play with --undefined as suggested by the ld man page. Not sure if there >>>>> is also some linker script statement that can do that trick, but it >>>>> might be worth checking. >>>> >>>> KEEP, together with --whole-archive does the trick: >>>> >>> >>> Why still --whole-archive? We should have a clear reason here. >> >> Doesn't work without --whole-archive, ld still drops it then. It's the >> combination of --whole-archive and KEEP() that makes it working for ARM >> on the one hand, and doesn't break the 32-bit x86 demo inmate on the other. >> >> I guess the reason is that KEEP() only keeps symbols that enter a 'final >> stage' of the linking process. And as those symbols are never referenced >> anywhere, they seem to be dropped before, like they never enter that >> stage of the process where they could be kept. > > Should be possible to confirm this: We have records of all stages (*.o, > *.a). > >> >> See [1], 4.6.4.4: >> When link-time garbage collection is in use (-gc-sections), it is >> often useful to mark sections that should not be eliminated. This is >> accomplished by surrounding an input section's wildcard entry with >> KEEP(), as in KEEP(*(.init)) or KEEP(SORT(*)(.ctors)). > > I'm wondering the following: > > - Is "--whole-archive --gc-sections" a reasonable combination (it > sounds contradictory), or does this just happen to work and will break > again with a different compiler version or some tuning elsewhere? > > - There is no size regression due to --whole-archive for the final > binaries, on all architectures?
No size regression on x86, but on arm. ld seems to behave different. Compared the objdumps on arm: inmates get in deed some really unused stuff in their binaries, like strcmp, ... Hmm. Will look for a better fix. Thanks Ralf > >> >> BTW: I read that __attribute__((used)) never affects the linking >> process, it only forces the compiler to not optimize away unreferenced >> things during compilation. > > That makes sense. > > Jan > -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
