Hello Eric, Am Freitag, 4. November 2016, 10:13:39 BRST schrieb Eric W. Biederman: > Baoquan He <bhe at redhat.com> writes: > > On 11/02/16 at 04:00am, Thiago Jung Bauermann wrote: > >> Hello, > >> > >> The kexec_file code currently builds the purgatory as a partially linked > >> object (using ld -r). Is there a particular reason to use that instead > >> of a position independent executable (PIE)? > > > > It's taken as "-r", relocatable in user space kexec-tools too originally. > > I think Vivek just keeps it the same when moving into kernel. > > At least on x86 using just -r removed the need for a GOT and all of the > other nasty dynamic relocatable bits, that are not needed when the you > don't want to share your text bits with the page cache. > > I can see reaons for refactoring code but I expect PIE expecutables need > a GOT and all of that pain in the neck stuff that can just be avoided by > building the code to run at an absolute address. At least on powerpc, building the purgatory as PIE resulted in only the following differences: 1. A lot less relocation types to deal with. 2. __kexec_load_purgatory needs to use the program headers rather than the section headers to figure out how to load the binary. 3. Symbol values are absolute addresses instead of relative to the start of the section. 2. is an advantage too because it's actually easier to use the program headers because unlike section headers, the purpose of program headers is to provide the information needed by a program loader. You can see this by comparing the two implementations of __kexec_load_purgatory in the WIP patch I posted. The one using program headers is simpler. 3. isn't a problem, it's easy to convert the absolute addresses back into relative ones, as can be seen in my patch. > So far I have not seen ELF relocations that are difficult to process. The problem is not that it's difficult to process, but that on powerpc it takes a lot of code to implement that processing. In v9 of the kexec_file_load implementation for powerpc, the switch statement implementing all the relocation types (shared by powerpc's module_64.c and machine_kexec_file_64.c) has 200 lines. The switch statement implementing only the relocation types used by the PIE purgatory has 26 lines. This is not a problem in x86, though: the purgatory built as a relocatable object has only two relocation types. -- Thiago Jung Bauermann IBM Linux Technology Center