On 2020-04-06, Kevin O'Connor wrote:
On Wed, Apr 01, 2020 at 10:29:13AM -0700, Fangrui Song wrote:
Accepting ET_EXEC as an input file is an extremely rare GNU ld feature that lld does not intend to support, because this is error-prone.
See Linux kernel commit 90ceddcb495008ac8ba7a3dce297841efcd7d584 for another use of the dd trick.
-- Changes v1 -> v2
- Add status=none to the dd command line. This suppresses dd's stderr output.
- Move dd command to a separate command
Signed-off-by: Fangrui Song maskray@google.com
Makefile | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/Makefile b/Makefile index 5f7d537..118dec0 100644 --- a/Makefile +++ b/Makefile @@ -177,10 +177,14 @@ $(OUT)romlayout32seg.lds $(OUT)romlayout32flat.lds $(OUT)code32flat.o $(OUT)code $(OUT)rom16.o: $(OUT)code16.o $(OUT)romlayout16.lds @echo " Linking $@" $(Q)$(LD) -T $(OUT)romlayout16.lds $< -o $@
- # Change e_type to ET_REL so that it can be used to link rom.o.
- # Unlike GNU ld, lld does not allow an ET_EXEC input.
- printf '\1' | dd of=$@ conv=notrunc bs=1 seek=16 status=none
$(OUT)rom32seg.o: $(OUT)code32seg.o $(OUT)romlayout32seg.lds @echo " Linking $@" $(Q)$(LD) -T $(OUT)romlayout32seg.lds $< -o $@
- printf '\1' | dd of=$@ conv=notrunc bs=1 seek=16 status=none
My high-level feedback is that the above is very fragile. I'd be reluctant to adopt that hack. What is the underlying issue that needs to be addressed?
-Kevin
lld does not take ET_EXEC as input. This is a deliberate choice. GNU gold does not accept ET_EXEC as well:
% gold a gold: error: a: unsupported ELF file type 2
1 ET_REL represents object files (.o) 2 ET_EXEC represents position-dependent executables. 3 ET_DYN represents shared objects (.so) (or PIE; for linking purposes, PIE cannot be accepted) 4 ET_CORE represents core files. For linking purposes, they cannot be accepted.
I don't know how GNU ld ends up accepting ET_EXEC. I am not even sure it is an intentional decision. A lot of sections will not be meaningful to the linker and accidentally mixing an ET_EXEC can likely lead to hard-to-debug linking issues.
I made a similar change to Linux recently. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
$(OUT)rom.o: $(OUT)rom16.strip.o $(OUT)rom32seg.strip.o $(OUT)code32flat.o $(OUT)romlayout32flat.lds @echo " Linking $@" -- 2.26.0.rc2.310.g2932bb562d-goog _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-leave@seabios.org