From 3d6b2e46175d34971337f584cacde8a14a658aa6 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Mon, 18 Nov 2024 16:00:36 -0800 Subject: [PATCH] Cleanup stub/*.lds linker scripts modified: Makefile modified: src/amd64-linux.elf-fold.lds modified: src/amd64-linux.elf-so_fold.lds modified: src/arm.v4a-linux.elf-entry.lds modified: src/arm.v4a-linux.elf-fold.lds modified: src/arm.v4a-linux.elf-so_entry.lds modified: src/arm.v4a-linux.elf-so_fold.lds modified: src/arm.v5a-linux.elf-entry.lds modified: src/arm.v5a-linux.elf-fold.lds modified: src/arm.v5a-linux.elf-so_entry.lds modified: src/arm.v5a-linux.elf-so_fold.lds modified: src/arm64-linux.elf-fold.lds modified: src/arm64-linux.elf-so_fold.lds modified: src/armeb.v4a-linux.elf-entry.lds modified: src/armeb.v4a-linux.elf-fold.lds modified: src/i386-bsd.elf-fold.lds modified: src/i386-linux.elf-fold.lds modified: src/i386-linux.elf-so_entry.lds modified: src/i386-linux.elf-so_fold.lds modified: src/i386-linux.elf.execve-fold.lds modified: src/i386-linux.elf.interp-fold.lds modified: src/i386-linux.elf.shell-fold.lds modified: src/mips.r3000-linux.elf-fold.lds modified: src/mipsel.r3000-linux.elf-fold.lds modified: src/powerpc-linux.elf-fold.lds modified: src/powerpc64-linux.elf-fold.lds modified: src/powerpc64le-linux.elf-fold.lds new file: src/upxfd_linux.c --- src/stub/Makefile | 71 +++++++++++++++----- src/stub/src/amd64-linux.elf-fold.lds | 3 +- src/stub/src/amd64-linux.elf-so_fold.lds | 40 +---------- src/stub/src/arm.v4a-linux.elf-entry.lds | 1 - src/stub/src/arm.v4a-linux.elf-fold.lds | 2 +- src/stub/src/arm.v4a-linux.elf-so_entry.lds | 1 - src/stub/src/arm.v4a-linux.elf-so_fold.lds | 7 +- src/stub/src/arm.v5a-linux.elf-entry.lds | 1 - src/stub/src/arm.v5a-linux.elf-fold.lds | 15 +---- src/stub/src/arm.v5a-linux.elf-so_entry.lds | 1 - src/stub/src/arm.v5a-linux.elf-so_fold.lds | 7 +- src/stub/src/arm64-linux.elf-fold.lds | 14 +++- src/stub/src/arm64-linux.elf-so_fold.lds | 2 +- src/stub/src/armeb.v4a-linux.elf-entry.lds | 1 - src/stub/src/armeb.v4a-linux.elf-fold.lds | 4 +- src/stub/src/i386-bsd.elf-fold.lds | 3 +- src/stub/src/i386-linux.elf-fold.lds | 3 +- src/stub/src/i386-linux.elf-so_entry.lds | 1 - src/stub/src/i386-linux.elf-so_fold.lds | 6 +- src/stub/src/i386-linux.elf.execve-fold.lds | 4 +- src/stub/src/i386-linux.elf.interp-fold.lds | 4 +- src/stub/src/i386-linux.elf.shell-fold.lds | 5 +- src/stub/src/mips.r3000-linux.elf-fold.lds | 5 +- src/stub/src/mipsel.r3000-linux.elf-fold.lds | 5 +- src/stub/src/powerpc-linux.elf-fold.lds | 5 +- src/stub/src/powerpc64-linux.elf-fold.lds | 3 +- src/stub/src/powerpc64le-linux.elf-fold.lds | 3 +- src/stub/src/upxfd_linux.c | 52 ++++++++++++++ 28 files changed, 156 insertions(+), 113 deletions(-) create mode 100644 src/stub/src/upxfd_linux.c diff --git a/src/stub/Makefile b/src/stub/Makefile index 5d6cdcd6..77f5f141 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -565,23 +565,27 @@ tc.arm.v4a-linux.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototype arm.v4a-linux.elf-entry.h : $(srcdir)/src/arm.v4a-linux.elf-entry.lds \ $(srcdir)/src/$$T.S \ - tmp/arm.v4a-linux.elf-upxfd_android.o + tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r --format=elf32-littlearm -Map tmp/$T.map -o tmp/$T.bin \ -T src/arm.v4a-linux.elf-entry.lds \ tmp/$T.o \ - tmp/arm.v4a-linux.elf-upxfd_android.o + tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ arm.v4a-linux.elf-so_entry.h : src/arm.v4a-linux.elf-so_entry.lds \ $(srcdir)/src/$$T.S \ - tmp/arm.v4a-linux.elf-upxfd_android.o + tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r --format=elf32-littlearm -Map tmp/$T.map -o tmp/$T.bin \ -T src/arm.v4a-linux.elf-so_entry.lds \ tmp/$T.o \ - tmp/arm.v4a-linux.elf-upxfd_android.o + tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ @@ -590,9 +594,15 @@ tmp/arm.v4a-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c $(call tc,objcopy) -R .comment $@ $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm +tmp/arm.v4a-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) -R .comment $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + arm.v4a-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o \ tmp/arm.v4a-expand.o \ tmp/arm.v4a-linux.elf-main2.o $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -602,6 +612,7 @@ arm.v4a-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ arm.v4a-linux.elf-so_fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/arm.v4a-linux.elf-upxfd_android.o \ + tmp/arm.v4a-linux.elf-upxfd_linux.o \ tmp/arm.v4a-expand.o \ tmp/arm.v4a-linux.elf-so_main.o multiarch-ld-2.23.90 -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -670,23 +681,27 @@ tc.arm.v5a-linux.elf.gcc += -Wall -W -Wcast-align -Wcast-qual -Wstrict-prototype arm.v5a-linux.elf-entry.h : $(srcdir)/src/arm.v5a-linux.elf-entry.lds \ $(srcdir)/src/$$T.S \ - tmp/arm.v5a-linux.elf-upxfd_android.o + tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r --format=elf32-littlearm -Map tmp/$T.map -o tmp/$T.bin \ -T src/arm.v5a-linux.elf-entry.lds \ tmp/$T.o \ - tmp/arm.v5a-linux.elf-upxfd_android.o + tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ arm.v5a-linux.elf-so_entry.h : src/arm.v5a-linux.elf-so_entry.lds \ $(srcdir)/src/$$T.S \ - tmp/arm.v5a-linux.elf-upxfd_android.o + tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r --format=elf32-littlearm -Map tmp/$T.map -o tmp/$T.bin \ -T src/arm.v5a-linux.elf-so_entry.lds \ tmp/$T.o \ - tmp/arm.v5a-linux.elf-upxfd_android.o + tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ @@ -695,9 +710,15 @@ tmp/arm.v5a-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c $(call tc,objcopy) -R .comment $@ $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm +tmp/arm.v5a-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) -R .comment $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + arm.v5a-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o \ tmp/arm.v5a-expand.o \ tmp/arm.v5a-linux.elf-main2.o $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -707,6 +728,7 @@ arm.v5a-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ arm.v5a-linux.elf-so_fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/arm.v5a-linux.elf-upxfd_android.o \ + tmp/arm.v5a-linux.elf-upxfd_linux.o \ tmp/arm.v5a-expand.o \ tmp/arm.v5a-linux.elf-so_main.o multiarch-ld-2.23.90 -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -895,18 +917,21 @@ tc.armeb.v4a-linux.elf.gcc = $(tc.arm.v4a-linux.elf.gcc) -mbig-endian -DBIG_ENDI armeb.v4a-linux.elf-entry.h : $(srcdir)/src/armeb.v4a-linux.elf-entry.lds \ $(srcdir)/src/$$T.S \ - tmp/armeb.v4a-linux.elf-upxfd_android.o + tmp/armeb.v4a-linux.elf-upxfd_android.o \ + tmp/armeb.v4a-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r --format=elf32-bigarm -Map tmp/$T.map -o tmp/$T.bin \ -T src/armeb.v4a-linux.elf-entry.lds \ tmp/$T.o \ - tmp/armeb.v4a-linux.elf-upxfd_android.o + tmp/armeb.v4a-linux.elf-upxfd_android.o \ + tmp/armeb.v4a-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ armeb.v4a-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/armeb.v4a-linux.elf-upxfd_android.o \ + tmp/armeb.v4a-linux.elf-upxfd_linux.o \ tmp/armeb.v4a-expand.o \ tmp/armeb.v4a-linux.elf-main2.o $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -918,6 +943,11 @@ tmp/armeb.v4a-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c $(call tc,objcopy) -R .comment $@ $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm +tmp/armeb.v4a-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) -R .comment $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + tmp/armeb.v4a-expand.o: $(srcdir)/src/$$T.S $(call tc,gcc) -c $< -o $@ @@ -1267,34 +1297,44 @@ tc.i386-linux.elf.gcc += -fweb i386-linux.elf-entry.h : $(srcdir)/src/i386-linux.elf-entry.lds \ $(srcdir)/src/$$T.S \ - tmp/i386-linux.elf-upxfd_android.o + tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r -Map tmp/$T.map -o tmp/$T.bin \ -T src/i386-linux.elf-entry.lds \ tmp/$T.o \ - tmp/i386-linux.elf-upxfd_android.o + tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ i386-linux.elf-so_entry.h : $(srcdir)/src/i386-linux.elf-so_entry.lds \ $(srcdir)/src/$$T.S \ - tmp/i386-linux.elf-upxfd_android.o + tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o $(call tc,gcc) -c $(srcdir)/src/$T.S -o tmp/$T.o multiarch-ld-2.17 -r -Map tmp/$T.map -o tmp/$T.bin \ -T src/i386-linux.elf-so_entry.lds \ tmp/$T.o \ - tmp/i386-linux.elf-upxfd_android.o + tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o $(call tc,f-embed_objinfo_without_xstrip,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ tmp/i386-linux.elf-upxfd_android.o : $(srcdir)/src/upxfd_android.c $(call tc,gcc) -c -O $< -o $@ - $(call tc,objcopy) -R .comment $@ + $(call tc,objcopy) --rename-section .text=UMF_ANDROID -R .comment -R .data -R .bss -R .note.GNU-stack $@ + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + +tmp/i386-linux.elf-upxfd_linux.o : $(srcdir)/src/upxfd_linux.c + $(call tc,gcc) -c -O $< -o $@ + $(call tc,objcopy) --rename-section .text=UMF_LINUX -R .comment -R .data -R .bss -R .note.GNU-stack $@ $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm i386-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o \ tmp/i386-expand.o \ tmp/i386-linux.elf-main2.o $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin @@ -1305,6 +1345,7 @@ i386-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ i386-linux.elf-so_fold.h : $(srcdir)/src/$$T.lds \ tmp/$$T.o \ tmp/i386-linux.elf-upxfd_android.o \ + tmp/i386-linux.elf-upxfd_linux.o \ tmp/i386-expand.o \ tmp/i386-linux.elf-so_main.o $(call tc,ld) -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin diff --git a/src/stub/src/amd64-linux.elf-fold.lds b/src/stub/src/amd64-linux.elf-fold.lds index d5810166..cc215282 100644 --- a/src/stub/src/amd64-linux.elf-fold.lds +++ b/src/stub/src/amd64-linux.elf-fold.lds @@ -30,9 +30,8 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) -/*ENTRY(_start)*/ SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/amd64-linux.elf-so_fold.lds b/src/stub/src/amd64-linux.elf-so_fold.lds index 53f6eeb5..dbba4a9b 100644 --- a/src/stub/src/amd64-linux.elf-so_fold.lds +++ b/src/stub/src/amd64-linux.elf-so_fold.lds @@ -11,46 +11,8 @@ */ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) -/* -multiarch-ld-2.17 --strip-all \ - -T ./src/amd64-linux.elf-so_fold.lds \ - -Map tmp/amd64-linux.elf-so_fold.map \ - tmp/amd64-linux.elf-so_fold.o \ - tmp/amd64-linux.elf-so_main.o \ - tmp/amd64-linux.elf-entry.o \ - -o tmp/amd64-linux.elf-so_fold.bin -*/ SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ -/*SO_HEAD : { *(SO_HEAD) }*/ -/* - .text : - { - *(.text.unlikely .text.*_unlikely .text.unlikely.*) - *(.text.exit .text.exit.*) - *(.text.startup .text.startup.*) - *(.text.hot .text.hot.*) - *(.text .stub .text.* .gnu.linkonce.t.*) - *(NRV_HEAD) - *(NRV2B) - *(NRV2E) - *(NRV2D) - *(NRV_TAIL) - *(LZMA*) - *(SO_MAIN) - *(SO_TAIL) - } - .data : - { - *(.data .data.* .gnu.linkonce.d.*) - } - .data1 : { *(.data1) } - .bss : - { - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - } -*/ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/arm.v4a-linux.elf-entry.lds b/src/stub/src/arm.v4a-linux.elf-entry.lds index 8774d1db..46cd2c52 100644 --- a/src/stub/src/arm.v4a-linux.elf-entry.lds +++ b/src/stub/src/arm.v4a-linux.elf-entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/arm.v4a-linux.elf-fold.lds b/src/stub/src/arm.v4a-linux.elf-fold.lds index be00a659..c7439294 100644 --- a/src/stub/src/arm.v4a-linux.elf-fold.lds +++ b/src/stub/src/arm.v4a-linux.elf-fold.lds @@ -33,5 +33,5 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/arm.v4a-linux.elf-so_entry.lds b/src/stub/src/arm.v4a-linux.elf-so_entry.lds index 8774d1db..46cd2c52 100644 --- a/src/stub/src/arm.v4a-linux.elf-so_entry.lds +++ b/src/stub/src/arm.v4a-linux.elf-so_entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/arm.v4a-linux.elf-so_fold.lds b/src/stub/src/arm.v4a-linux.elf-so_fold.lds index 65133a5c..4b096a38 100644 --- a/src/stub/src/arm.v4a-linux.elf-so_fold.lds +++ b/src/stub/src/arm.v4a-linux.elf-so_fold.lds @@ -1,10 +1,7 @@ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) SECTIONS { - SO_HEAD : { - *(SO_HEAD) - *(.text) - } + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/arm.v5a-linux.elf-entry.lds b/src/stub/src/arm.v5a-linux.elf-entry.lds index 8774d1db..46cd2c52 100644 --- a/src/stub/src/arm.v5a-linux.elf-entry.lds +++ b/src/stub/src/arm.v5a-linux.elf-entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/arm.v5a-linux.elf-fold.lds b/src/stub/src/arm.v5a-linux.elf-fold.lds index 3a686c34..d2dae5c3 100644 --- a/src/stub/src/arm.v5a-linux.elf-fold.lds +++ b/src/stub/src/arm.v5a-linux.elf-fold.lds @@ -30,19 +30,8 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) -/*ENTRY(_start)*/ -PHDRS -{ - text PT_LOAD FILEHDR PHDRS ; - data PT_LOAD ; /* for setting brk(0) */ -} + SECTIONS { -/* . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ - .text : { - *(.text) - *(.data) - } : text - .data : { - } : data + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/arm.v5a-linux.elf-so_entry.lds b/src/stub/src/arm.v5a-linux.elf-so_entry.lds index 8774d1db..46cd2c52 100644 --- a/src/stub/src/arm.v5a-linux.elf-so_entry.lds +++ b/src/stub/src/arm.v5a-linux.elf-so_entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/arm.v5a-linux.elf-so_fold.lds b/src/stub/src/arm.v5a-linux.elf-so_fold.lds index 65133a5c..4b096a38 100644 --- a/src/stub/src/arm.v5a-linux.elf-so_fold.lds +++ b/src/stub/src/arm.v5a-linux.elf-so_fold.lds @@ -1,10 +1,7 @@ -OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) SECTIONS { - SO_HEAD : { - *(SO_HEAD) - *(.text) - } + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/arm64-linux.elf-fold.lds b/src/stub/src/arm64-linux.elf-fold.lds index fe9e3a78..a458bb91 100644 --- a/src/stub/src/arm64-linux.elf-fold.lds +++ b/src/stub/src/arm64-linux.elf-fold.lds @@ -30,7 +30,19 @@ OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) + +PHDRS +{ + text PT_LOAD FILEHDR PHDRS FLAGS ( 5 ) ; /* r-x (no -w-) */ + data PT_LOAD ; /* for setting brk(0) */ +} SECTIONS { - . = SIZEOF_HEADERS + 12 ; + . = SIZEOF_HEADERS; + .text : { + *(.text) + *(.data) + } : text + .data : { + } : data } diff --git a/src/stub/src/arm64-linux.elf-so_fold.lds b/src/stub/src/arm64-linux.elf-so_fold.lds index 0b71b06b..440b0458 100644 --- a/src/stub/src/arm64-linux.elf-so_fold.lds +++ b/src/stub/src/arm64-linux.elf-so_fold.lds @@ -3,5 +3,5 @@ OUTPUT_ARCH(aarch64) SECTIONS { - . = SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/armeb.v4a-linux.elf-entry.lds b/src/stub/src/armeb.v4a-linux.elf-entry.lds index ac9a1e92..a49c7b06 100644 --- a/src/stub/src/armeb.v4a-linux.elf-entry.lds +++ b/src/stub/src/armeb.v4a-linux.elf-entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/armeb.v4a-linux.elf-fold.lds b/src/stub/src/armeb.v4a-linux.elf-fold.lds index 0f2b85b4..10856b8c 100644 --- a/src/stub/src/armeb.v4a-linux.elf-fold.lds +++ b/src/stub/src/armeb.v4a-linux.elf-fold.lds @@ -28,10 +28,10 @@ */ -OUTPUT_FORMAT("elf32-bigarm", "elf32-bigarm", "elf32-littlearm") +OUTPUT_FORMAT("elf32-bigarm", "elf32-bigarm", "elf32-bigarm") OUTPUT_ARCH(arm) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/i386-bsd.elf-fold.lds b/src/stub/src/i386-bsd.elf-fold.lds index 9c515d0a..2e9c6e16 100644 --- a/src/stub/src/i386-bsd.elf-fold.lds +++ b/src/stub/src/i386-bsd.elf-fold.lds @@ -31,6 +31,7 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) /*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; @@ -38,7 +39,7 @@ PHDRS } SECTIONS { - . = 0x00c01000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/i386-linux.elf-fold.lds b/src/stub/src/i386-linux.elf-fold.lds index 2515f7a9..ba9e3d7f 100644 --- a/src/stub/src/i386-linux.elf-fold.lds +++ b/src/stub/src/i386-linux.elf-fold.lds @@ -30,9 +30,8 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) -/*ENTRY(_start)*/ SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/i386-linux.elf-so_entry.lds b/src/stub/src/i386-linux.elf-so_entry.lds index 8ffcb623..0e048002 100644 --- a/src/stub/src/i386-linux.elf-so_entry.lds +++ b/src/stub/src/i386-linux.elf-so_entry.lds @@ -3,7 +3,6 @@ OUTPUT_ARCH(i386) SECTIONS { - . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ .text : { } ELFMAINX : { diff --git a/src/stub/src/i386-linux.elf-so_fold.lds b/src/stub/src/i386-linux.elf-so_fold.lds index a967f52d..f45170ee 100644 --- a/src/stub/src/i386-linux.elf-so_fold.lds +++ b/src/stub/src/i386-linux.elf-so_fold.lds @@ -1,10 +1,6 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) - SECTIONS { - SO_HEAD : { - *(SO_HEAD) - *(.text) - } + . = SIZEOF_HEADERS; } diff --git a/src/stub/src/i386-linux.elf.execve-fold.lds b/src/stub/src/i386-linux.elf.execve-fold.lds index bfa8031c..7e75207e 100644 --- a/src/stub/src/i386-linux.elf.execve-fold.lds +++ b/src/stub/src/i386-linux.elf.execve-fold.lds @@ -30,7 +30,7 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) -/*ENTRY(_start)*/ + PHDRS { phdr0 PT_LOAD FILEHDR PHDRS FLAGS(5); /* no PF_W: strict SELinux, PaX, grSecurity */ @@ -39,7 +39,7 @@ PHDRS SECTIONS { - . = 0x00401000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + . = SIZEOF_HEADERS; .data : { /* put everything together in one Phdr */ *(.text) *(.rodata) diff --git a/src/stub/src/i386-linux.elf.interp-fold.lds b/src/stub/src/i386-linux.elf.interp-fold.lds index a252586d..e5efd700 100644 --- a/src/stub/src/i386-linux.elf.interp-fold.lds +++ b/src/stub/src/i386-linux.elf.interp-fold.lds @@ -30,7 +30,7 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) -/*ENTRY(_start)*/ + PHDRS /* force exactly 1 ELF32_Phdr: in particular, no PT_GNU_STACK */ { phdr0 PT_LOAD FILEHDR PHDRS FLAGS(5); /* no PF_W */ @@ -39,7 +39,7 @@ PHDRS /* force exactly 1 ELF32_Phdr: in particular, no PT_GNU_STACK */ SECTIONS { - . = 0x10000 + SIZEOF_HEADERS; + . = SIZEOF_HEADERS; .text : { /* put everything together in one Phdr */ *(.text) *(.rodata) diff --git a/src/stub/src/i386-linux.elf.shell-fold.lds b/src/stub/src/i386-linux.elf.shell-fold.lds index c8ee3f1e..78dfa2c9 100644 --- a/src/stub/src/i386-linux.elf.shell-fold.lds +++ b/src/stub/src/i386-linux.elf.shell-fold.lds @@ -30,7 +30,7 @@ OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) -/*ENTRY(_start)*/ + PHDRS { phdr0 PT_LOAD FILEHDR PHDRS FLAGS(5); /* no PF_W: strict SELinux, PaX, grSecurity */ @@ -39,8 +39,7 @@ PHDRS SECTIONS { - /* 0x01400000: avoid 0x01000000 for shell itself being compressed */ - . = 0x01400000 + SIZEOF_HEADERS; + . = SIZEOF_HEADERS; . = ALIGN(0x80); .data : { /* put everything together in one Phdr */ *(.text) diff --git a/src/stub/src/mips.r3000-linux.elf-fold.lds b/src/stub/src/mips.r3000-linux.elf-fold.lds index f3fdac50..03894700 100644 --- a/src/stub/src/mips.r3000-linux.elf-fold.lds +++ b/src/stub/src/mips.r3000-linux.elf-fold.lds @@ -30,14 +30,15 @@ OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips") OUTPUT_ARCH(mips) -/*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; - data PT_LOAD ; + data PT_LOAD ; /* for setting brk(0) */ } SECTIONS { + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/mipsel.r3000-linux.elf-fold.lds b/src/stub/src/mipsel.r3000-linux.elf-fold.lds index 913a46b7..08d74a79 100644 --- a/src/stub/src/mipsel.r3000-linux.elf-fold.lds +++ b/src/stub/src/mipsel.r3000-linux.elf-fold.lds @@ -30,14 +30,15 @@ OUTPUT_FORMAT("elf32-littlemips", "elf32-bigmips", "elf32-littlemips") OUTPUT_ARCH(mips) -/*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; - data PT_LOAD ; + data PT_LOAD ; /* for setting brk(0) */ } SECTIONS { + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/powerpc-linux.elf-fold.lds b/src/stub/src/powerpc-linux.elf-fold.lds index 81cb1ea7..ea41e70a 100644 --- a/src/stub/src/powerpc-linux.elf-fold.lds +++ b/src/stub/src/powerpc-linux.elf-fold.lds @@ -30,14 +30,15 @@ OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") OUTPUT_ARCH(powerpc:common) -/*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; - data PT_LOAD ; + data PT_LOAD ; /* for setting brk(0) */ } SECTIONS { + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/powerpc64-linux.elf-fold.lds b/src/stub/src/powerpc64-linux.elf-fold.lds index 3b567e22..93724553 100644 --- a/src/stub/src/powerpc64-linux.elf-fold.lds +++ b/src/stub/src/powerpc64-linux.elf-fold.lds @@ -30,7 +30,7 @@ OUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc", "elf64-powerpc") OUTPUT_ARCH(powerpc:common64) -/*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; @@ -38,6 +38,7 @@ PHDRS } SECTIONS { + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/powerpc64le-linux.elf-fold.lds b/src/stub/src/powerpc64le-linux.elf-fold.lds index a713e787..0cbb9e4a 100644 --- a/src/stub/src/powerpc64le-linux.elf-fold.lds +++ b/src/stub/src/powerpc64le-linux.elf-fold.lds @@ -30,7 +30,7 @@ OUTPUT_FORMAT("elf64-powerpcle", "elf64-powerpcle", "elf64-powerpcle") OUTPUT_ARCH(powerpc:common64) -/*ENTRY(_start)*/ + PHDRS { text PT_LOAD FILEHDR PHDRS ; @@ -38,6 +38,7 @@ PHDRS } SECTIONS { + . = SIZEOF_HEADERS; .text : { *(.text) *(.data) diff --git a/src/stub/src/upxfd_linux.c b/src/stub/src/upxfd_linux.c new file mode 100644 index 00000000..1550015f --- /dev/null +++ b/src/stub/src/upxfd_linux.c @@ -0,0 +1,52 @@ +/* upxfd_create.c -- workaround for 32-bit Android + + This file is part of the UPX executable compressor. + + Copyright (C) 2023 John F. Reiser + All Rights Reserved. + */ + +#include "include/linux.h" // syscall decls; i386 inlines via "int 0x80" +#define MFD_EXEC 0x10 +//#define O_RDWR 2 +#define O_DIRECTORY 0200000 /* 0x010000 asm-generic/fcntl.h */ +#define O_TMPFILE 020000000 /* 0x400000 asm-generic/fcntl.h */ +#define EINVAL 22 /* asm-generic/errno-base.h */ +// Implementation for Linux-native, where memfd_create +// (or /dev/shm) works. Saves space in contrast to +// upxfd_android (or Android emulator), which must +// fall back to /data/data/$APP_NAME/cache/upxAAA , +// and also must work around inconsistent __NR_ftruncate. +// 1. Try memfd_create +// 2. Try /dev/shm +unsigned long upx_mmap_and_fd_linux( // returns (mapped_addr | (1+ fd)) + void *ptr // desired address + , unsigned datlen // mapped length + , char *pathname // 0 ==> get_upxfn_path() +) +{ + (void)pathname; // FIXME NYI + char str_upx[] = {'u','p','x',0}; + int fd = memfd_create(str_upx, MFD_EXEC); + if (-EINVAL == fd) { // 2024-10-15 MFD_EXEC unknown to ubuntu-20.04 + fd = memfd_create(str_upx, 0); // try again + } + if (fd < 0) { // last chance for Linux + char str_dev_shm[] = {'/','d','e','v','/','s','h','m', 0}; + fd = open(str_dev_shm, O_RDWR | O_DIRECTORY | O_TMPFILE, 0700); + if (fd < 0) { + return (unsigned long)(long)fd; + } + // Beware: /dev/shm might limit write() to 8KiB at a time. + } + int rv = ftruncate(fd, datlen); + if (rv < 0) { + return (unsigned long)(long)rv; + } + ptr = mmap(ptr, datlen, PROT_READ|PROT_WRITE, + (ptr ? MAP_FIXED : 0)|MAP_SHARED, fd, 0); + if (PAGE_MASK <= (unsigned long)ptr) { + return (unsigned long)ptr; // errno + } + return (unsigned long)ptr + (1+ (unsigned)fd); +}