diff options
| author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-06-19 00:00:00 +0000 |
|---|---|---|
| committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-06-19 15:32:41 +0500 |
| commit | a7a1d4a241492e81f659a920f7379c193593ebc6 (patch) | |
| tree | 2ff203d3b43b3f6d18abaac21923f729fdb93e43 | |
| parent | 89a73b901229c8550c172c9556ff8442ae7ac4b8 (diff) | |
| download | 7zip-24.07.tar.gz 7zip-24.07.tar.bz2 7zip-24.07.zip | |
24.0724.07
32 files changed, 400 insertions, 161 deletions
diff --git a/Asm/x86/LzFindOpt.asm b/Asm/x86/LzFindOpt.asm index 42e10bd..94c5c76 100644 --- a/Asm/x86/LzFindOpt.asm +++ b/Asm/x86/LzFindOpt.asm | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | ; LzFindOpt.asm -- ASM version of GetMatchesSpecN_2() function | 1 | ; LzFindOpt.asm -- ASM version of GetMatchesSpecN_2() function |
| 2 | ; 2021-07-21: Igor Pavlov : Public domain | 2 | ; 2024-06-18: Igor Pavlov : Public domain |
| 3 | ; | 3 | ; |
| 4 | 4 | ||
| 5 | ifndef x64 | 5 | ifndef x64 |
| @@ -11,10 +11,31 @@ include 7zAsm.asm | |||
| 11 | 11 | ||
| 12 | MY_ASM_START | 12 | MY_ASM_START |
| 13 | 13 | ||
| 14 | _TEXT$LZFINDOPT SEGMENT ALIGN(64) 'CODE' | 14 | ifndef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT |
| 15 | if (IS_LINUX gt 0) | ||
| 16 | Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1 | ||
| 17 | else | ||
| 18 | Z7_LZ_FIND_OPT_ASM_USE_SEGMENT equ 1 | ||
| 19 | endif | ||
| 20 | endif | ||
| 15 | 21 | ||
| 22 | ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT | ||
| 23 | _TEXT$LZFINDOPT SEGMENT ALIGN(64) 'CODE' | ||
| 16 | MY_ALIGN macro num:req | 24 | MY_ALIGN macro num:req |
| 17 | align num | 25 | align num |
| 26 | ; align 16 | ||
| 27 | endm | ||
| 28 | else | ||
| 29 | MY_ALIGN macro num:req | ||
| 30 | ; We expect that ".text" is aligned for 16-bytes. | ||
| 31 | ; So we don't need large alignment inside our function. | ||
| 32 | align 16 | ||
| 33 | endm | ||
| 34 | endif | ||
| 35 | |||
| 36 | |||
| 37 | MY_ALIGN_16 macro | ||
| 38 | MY_ALIGN 16 | ||
| 18 | endm | 39 | endm |
| 19 | 40 | ||
| 20 | MY_ALIGN_32 macro | 41 | MY_ALIGN_32 macro |
| @@ -136,7 +157,11 @@ COPY_VAR_64 macro dest_var, src_var | |||
| 136 | endm | 157 | endm |
| 137 | 158 | ||
| 138 | 159 | ||
| 160 | ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT | ||
| 139 | ; MY_ALIGN_64 | 161 | ; MY_ALIGN_64 |
| 162 | else | ||
| 163 | MY_ALIGN_16 | ||
| 164 | endif | ||
| 140 | MY_PROC GetMatchesSpecN_2, 13 | 165 | MY_PROC GetMatchesSpecN_2, 13 |
| 141 | MY_PUSH_PRESERVED_ABI_REGS | 166 | MY_PUSH_PRESERVED_ABI_REGS |
| 142 | mov r0, RSP | 167 | mov r0, RSP |
| @@ -508,6 +533,8 @@ fin: | |||
| 508 | MY_POP_PRESERVED_ABI_REGS | 533 | MY_POP_PRESERVED_ABI_REGS |
| 509 | MY_ENDP | 534 | MY_ENDP |
| 510 | 535 | ||
| 536 | ifdef Z7_LZ_FIND_OPT_ASM_USE_SEGMENT | ||
| 511 | _TEXT$LZFINDOPT ENDS | 537 | _TEXT$LZFINDOPT ENDS |
| 538 | endif | ||
| 512 | 539 | ||
| 513 | end | 540 | end |
diff --git a/Asm/x86/LzmaDecOpt.asm b/Asm/x86/LzmaDecOpt.asm index f2818e7..7c568df 100644 --- a/Asm/x86/LzmaDecOpt.asm +++ b/Asm/x86/LzmaDecOpt.asm | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | ; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function | 1 | ; LzmaDecOpt.asm -- ASM version of LzmaDec_DecodeReal_3() function |
| 2 | ; 2021-02-23: Igor Pavlov : Public domain | 2 | ; 2024-06-18: Igor Pavlov : Public domain |
| 3 | ; | 3 | ; |
| 4 | ; 3 - is the code compatibility version of LzmaDec_DecodeReal_*() | 4 | ; 3 - is the code compatibility version of LzmaDec_DecodeReal_*() |
| 5 | ; function for check at link time. | 5 | ; function for check at link time. |
| @@ -17,11 +17,41 @@ include 7zAsm.asm | |||
| 17 | 17 | ||
| 18 | MY_ASM_START | 18 | MY_ASM_START |
| 19 | 19 | ||
| 20 | _TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' | 20 | ; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is defined, we use additional SEGMENT with 64-byte alignment. |
| 21 | ; if Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT is not defined, we use default SEGMENT (where default 16-byte alignment of segment is expected). | ||
| 22 | ; The performance is almost identical in our tests. | ||
| 23 | ; But the performance can depend from position of lzmadec code inside instruction cache | ||
| 24 | ; or micro-op cache line (depending from low address bits in 32-byte/64-byte cache lines). | ||
| 25 | ; And 64-byte alignment provides a more consistent speed regardless | ||
| 26 | ; of the code's position in the executable. | ||
| 27 | ; But also it's possible that code without Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT can be | ||
| 28 | ; slightly faster than 64-bytes aligned code in some cases, if offset of lzmadec | ||
| 29 | ; code in 64-byte block after compilation provides better speed by some reason. | ||
| 30 | ; Note that Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT adds an extra section to the ELF file. | ||
| 31 | ; If you don't want to get that extra section, do not define Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT. | ||
| 32 | |||
| 33 | ifndef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT | ||
| 34 | if (IS_LINUX gt 0) | ||
| 35 | Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1 | ||
| 36 | else | ||
| 37 | Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT equ 1 | ||
| 38 | endif | ||
| 39 | endif | ||
| 21 | 40 | ||
| 41 | ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT | ||
| 42 | _TEXT$LZMADECOPT SEGMENT ALIGN(64) 'CODE' | ||
| 22 | MY_ALIGN macro num:req | 43 | MY_ALIGN macro num:req |
| 23 | align num | 44 | align num |
| 45 | ; align 16 | ||
| 24 | endm | 46 | endm |
| 47 | else | ||
| 48 | MY_ALIGN macro num:req | ||
| 49 | ; We expect that ".text" is aligned for 16-bytes. | ||
| 50 | ; So we don't need large alignment inside out function. | ||
| 51 | align 16 | ||
| 52 | endm | ||
| 53 | endif | ||
| 54 | |||
| 25 | 55 | ||
| 26 | MY_ALIGN_16 macro | 56 | MY_ALIGN_16 macro |
| 27 | MY_ALIGN 16 | 57 | MY_ALIGN 16 |
| @@ -610,7 +640,11 @@ PARAM_lzma equ REG_ABI_PARAM_0 | |||
| 610 | PARAM_limit equ REG_ABI_PARAM_1 | 640 | PARAM_limit equ REG_ABI_PARAM_1 |
| 611 | PARAM_bufLimit equ REG_ABI_PARAM_2 | 641 | PARAM_bufLimit equ REG_ABI_PARAM_2 |
| 612 | 642 | ||
| 643 | ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT | ||
| 613 | ; MY_ALIGN_64 | 644 | ; MY_ALIGN_64 |
| 645 | else | ||
| 646 | MY_ALIGN_16 | ||
| 647 | endif | ||
| 614 | MY_PROC LzmaDec_DecodeReal_3, 3 | 648 | MY_PROC LzmaDec_DecodeReal_3, 3 |
| 615 | MY_PUSH_PRESERVED_ABI_REGS | 649 | MY_PUSH_PRESERVED_ABI_REGS |
| 616 | 650 | ||
| @@ -1298,6 +1332,8 @@ fin: | |||
| 1298 | MY_POP_PRESERVED_ABI_REGS | 1332 | MY_POP_PRESERVED_ABI_REGS |
| 1299 | MY_ENDP | 1333 | MY_ENDP |
| 1300 | 1334 | ||
| 1335 | ifdef Z7_LZMA_DEC_OPT_ASM_USE_SEGMENT | ||
| 1301 | _TEXT$LZMADECOPT ENDS | 1336 | _TEXT$LZMADECOPT ENDS |
| 1337 | endif | ||
| 1302 | 1338 | ||
| 1303 | end | 1339 | end |
diff --git a/Asm/x86/Sha1Opt.asm b/Asm/x86/Sha1Opt.asm index 3495fd1..0b63aeb 100644 --- a/Asm/x86/Sha1Opt.asm +++ b/Asm/x86/Sha1Opt.asm | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | ; Sha1Opt.asm -- SHA-1 optimized code for SHA-1 x86 hardware instructions | 1 | ; Sha1Opt.asm -- SHA-1 optimized code for SHA-1 x86 hardware instructions |
| 2 | ; 2021-03-10 : Igor Pavlov : Public domain | 2 | ; 2024-06-16 : Igor Pavlov : Public domain |
| 3 | 3 | ||
| 4 | include 7zAsm.asm | 4 | include 7zAsm.asm |
| 5 | 5 | ||
| @@ -20,7 +20,7 @@ MY_ASM_START | |||
| 20 | 20 | ||
| 21 | 21 | ||
| 22 | 22 | ||
| 23 | CONST SEGMENT | 23 | CONST SEGMENT READONLY |
| 24 | 24 | ||
| 25 | align 16 | 25 | align 16 |
| 26 | Reverse_Endian_Mask db 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 | 26 | Reverse_Endian_Mask db 15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0 |
diff --git a/Asm/x86/Sha256Opt.asm b/Asm/x86/Sha256Opt.asm index 3e9f6ed..bc2f9da 100644 --- a/Asm/x86/Sha256Opt.asm +++ b/Asm/x86/Sha256Opt.asm | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | ; Sha256Opt.asm -- SHA-256 optimized code for SHA-256 x86 hardware instructions | 1 | ; Sha256Opt.asm -- SHA-256 optimized code for SHA-256 x86 hardware instructions |
| 2 | ; 2022-04-17 : Igor Pavlov : Public domain | 2 | ; 2024-06-16 : Igor Pavlov : Public domain |
| 3 | 3 | ||
| 4 | include 7zAsm.asm | 4 | include 7zAsm.asm |
| 5 | 5 | ||
| @@ -20,7 +20,7 @@ endif | |||
| 20 | EXTRN K_CONST:xmmword | 20 | EXTRN K_CONST:xmmword |
| 21 | @ | 21 | @ |
| 22 | 22 | ||
| 23 | CONST SEGMENT | 23 | CONST SEGMENT READONLY |
| 24 | 24 | ||
| 25 | align 16 | 25 | align 16 |
| 26 | Reverse_Endian_Mask db 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12 | 26 | Reverse_Endian_Mask db 3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12 |
diff --git a/C/7zVersion.h b/C/7zVersion.h index 75052e9..9a335a0 100644 --- a/C/7zVersion.h +++ b/C/7zVersion.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #define MY_VER_MAJOR 24 | 1 | #define MY_VER_MAJOR 24 |
| 2 | #define MY_VER_MINOR 06 | 2 | #define MY_VER_MINOR 07 |
| 3 | #define MY_VER_BUILD 0 | 3 | #define MY_VER_BUILD 0 |
| 4 | #define MY_VERSION_NUMBERS "24.06" | 4 | #define MY_VERSION_NUMBERS "24.07" |
| 5 | #define MY_VERSION MY_VERSION_NUMBERS | 5 | #define MY_VERSION MY_VERSION_NUMBERS |
| 6 | 6 | ||
| 7 | #ifdef MY_CPU_NAME | 7 | #ifdef MY_CPU_NAME |
| @@ -10,7 +10,7 @@ | |||
| 10 | #define MY_VERSION_CPU MY_VERSION | 10 | #define MY_VERSION_CPU MY_VERSION |
| 11 | #endif | 11 | #endif |
| 12 | 12 | ||
| 13 | #define MY_DATE "2024-05-26" | 13 | #define MY_DATE "2024-06-19" |
| 14 | #undef MY_COPYRIGHT | 14 | #undef MY_COPYRIGHT |
| 15 | #undef MY_VERSION_COPYRIGHT_DATE | 15 | #undef MY_VERSION_COPYRIGHT_DATE |
| 16 | #define MY_AUTHOR_NAME "Igor Pavlov" | 16 | #define MY_AUTHOR_NAME "Igor Pavlov" |
diff --git a/C/CpuArch.h b/C/CpuArch.h index d632c2b..683cfaa 100644 --- a/C/CpuArch.h +++ b/C/CpuArch.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* CpuArch.h -- CPU specific code | 1 | /* CpuArch.h -- CPU specific code |
| 2 | 2024-05-18 : Igor Pavlov : Public domain */ | 2 | 2024-06-17 : Igor Pavlov : Public domain */ |
| 3 | 3 | ||
| 4 | #ifndef ZIP7_INC_CPU_ARCH_H | 4 | #ifndef ZIP7_INC_CPU_ARCH_H |
| 5 | #define ZIP7_INC_CPU_ARCH_H | 5 | #define ZIP7_INC_CPU_ARCH_H |
| @@ -564,6 +564,7 @@ problem-4 : performace: | |||
| 564 | #define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); } | 564 | #define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); } |
| 565 | #define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); } | 565 | #define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); } |
| 566 | 566 | ||
| 567 | #define GetUi64a(p) GetUi64(p) | ||
| 567 | #define GetUi32a(p) GetUi32(p) | 568 | #define GetUi32a(p) GetUi32(p) |
| 568 | #define GetUi16a(p) GetUi16(p) | 569 | #define GetUi16a(p) GetUi16(p) |
| 569 | #define SetUi32a(p, v) SetUi32(p, v) | 570 | #define SetUi32a(p, v) SetUi32(p, v) |
| @@ -571,6 +572,7 @@ problem-4 : performace: | |||
| 571 | 572 | ||
| 572 | #elif defined(MY_CPU_LE) | 573 | #elif defined(MY_CPU_LE) |
| 573 | 574 | ||
| 575 | #define GetUi64a(p) (*(const UInt64 *)(const void *)(p)) | ||
| 574 | #define GetUi32a(p) (*(const UInt32 *)(const void *)(p)) | 576 | #define GetUi32a(p) (*(const UInt32 *)(const void *)(p)) |
| 575 | #define GetUi16a(p) (*(const UInt16 *)(const void *)(p)) | 577 | #define GetUi16a(p) (*(const UInt16 *)(const void *)(p)) |
| 576 | #define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); } | 578 | #define SetUi32a(p, v) { *(UInt32 *)(void *)(p) = (v); } |
diff --git a/C/ZstdDec.c b/C/ZstdDec.c index ac159d6..6ad47eb 100644 --- a/C/ZstdDec.c +++ b/C/ZstdDec.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* ZstdDec.c -- Zstd Decoder | 1 | /* ZstdDec.c -- Zstd Decoder |
| 2 | 2024-05-26 : the code was developed by Igor Pavlov, using Zstandard format | 2 | 2024-06-18 : the code was developed by Igor Pavlov, using Zstandard format |
| 3 | specification and original zstd decoder code as reference code. | 3 | specification and original zstd decoder code as reference code. |
| 4 | original zstd decoder code: Copyright (c) Facebook, Inc. All rights reserved. | 4 | original zstd decoder code: Copyright (c) Facebook, Inc. All rights reserved. |
| 5 | This source code is licensed under BSD 3-Clause License. | 5 | This source code is licensed under BSD 3-Clause License. |
| @@ -1308,8 +1308,10 @@ FSE_Decode_SeqTable(CFseRecord * const table, | |||
| 1308 | in->len--; | 1308 | in->len--; |
| 1309 | { | 1309 | { |
| 1310 | const Byte *ptr = in->ptr; | 1310 | const Byte *ptr = in->ptr; |
| 1311 | const Byte sym = ptr[0]; | 1311 | const unsigned sym = ptr[0]; |
| 1312 | in->ptr = ptr + 1; | 1312 | in->ptr = ptr + 1; |
| 1313 | if (sym >= numSymbolsMax) | ||
| 1314 | return SZ_ERROR_DATA; | ||
| 1313 | table[0] = (FastInt32)sym | 1315 | table[0] = (FastInt32)sym |
| 1314 | #if defined(Z7_ZSTD_DEC_USE_ML_PLUS3) | 1316 | #if defined(Z7_ZSTD_DEC_USE_ML_PLUS3) |
| 1315 | + (numSymbolsMax == NUM_ML_SYMBOLS ? MATCH_LEN_MIN : 0) | 1317 | + (numSymbolsMax == NUM_ML_SYMBOLS ? MATCH_LEN_MIN : 0) |
diff --git a/CPP/7zip/7zip_gcc.mak b/CPP/7zip/7zip_gcc.mak index f6a044f..45c9ab3 100644 --- a/CPP/7zip/7zip_gcc.mak +++ b/CPP/7zip/7zip_gcc.mak | |||
| @@ -220,6 +220,9 @@ endif | |||
| 220 | 220 | ||
| 221 | all: $(O) $(PROGPATH) $(STATIC_TARGET) | 221 | all: $(O) $(PROGPATH) $(STATIC_TARGET) |
| 222 | 222 | ||
| 223 | # we need $(O) as order-only-prerequisites: | ||
| 224 | $(OBJS): | $(O) | ||
| 225 | |||
| 223 | $(O): | 226 | $(O): |
| 224 | $(MY_MKDIR) $(O) | 227 | $(MY_MKDIR) $(O) |
| 225 | 228 | ||
diff --git a/CPP/7zip/Archive/7z/7zUpdate.cpp b/CPP/7zip/Archive/7z/7zUpdate.cpp index d374a00..c8c5d26 100644 --- a/CPP/7zip/Archive/7z/7zUpdate.cpp +++ b/CPP/7zip/Archive/7z/7zUpdate.cpp | |||
| @@ -219,6 +219,14 @@ static int Parse_EXE(const Byte *buf, size_t size, CFilterMode *filterMode) | |||
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | 221 | ||
| 222 | /* | ||
| 223 | Filters don't improve the compression ratio for relocatable object files (".o"). | ||
| 224 | But we can get compression ratio gain, if we compress object | ||
| 225 | files and executables in same solid block. | ||
| 226 | So we use filters for relocatable object files (".o"): | ||
| 227 | */ | ||
| 228 | // #define Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ | ||
| 229 | |||
| 222 | /* ---------- ELF ---------- */ | 230 | /* ---------- ELF ---------- */ |
| 223 | 231 | ||
| 224 | #define ELF_SIG 0x464C457F | 232 | #define ELF_SIG 0x464C457F |
| @@ -258,6 +266,12 @@ static int Parse_ELF(const Byte *buf, size_t size, CFilterMode *filterMode) | |||
| 258 | default: return 0; | 266 | default: return 0; |
| 259 | } | 267 | } |
| 260 | 268 | ||
| 269 | #ifdef Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ | ||
| 270 | #define ELF_ET_REL 1 | ||
| 271 | if (Get16(buf + 0x10, be) == ELF_ET_REL) | ||
| 272 | return 0; | ||
| 273 | #endif | ||
| 274 | |||
| 261 | switch (Get16(buf + 0x12, be)) | 275 | switch (Get16(buf + 0x12, be)) |
| 262 | { | 276 | { |
| 263 | case 3: | 277 | case 3: |
| @@ -318,6 +332,12 @@ static unsigned Parse_MACH(const Byte *buf, size_t size, CFilterMode *filterMode | |||
| 318 | default: return 0; | 332 | default: return 0; |
| 319 | } | 333 | } |
| 320 | 334 | ||
| 335 | #ifdef Z7_7Z_CREATE_ARC_DISABLE_FILTER_FOR_OBJ | ||
| 336 | #define MACH_TYPE_OBJECT 1 | ||
| 337 | if (Get32(buf + 0xC, be) == MACH_TYPE_OBJECT) | ||
| 338 | return 0; | ||
| 339 | #endif | ||
| 340 | |||
| 321 | switch (Get32(buf + 4, be)) | 341 | switch (Get32(buf + 4, be)) |
| 322 | { | 342 | { |
| 323 | case MACH_MACHINE_386: | 343 | case MACH_MACHINE_386: |
diff --git a/CPP/7zip/Archive/ElfHandler.cpp b/CPP/7zip/Archive/ElfHandler.cpp index e31b4ae..305173b 100644 --- a/CPP/7zip/Archive/ElfHandler.cpp +++ b/CPP/7zip/Archive/ElfHandler.cpp | |||
| @@ -17,11 +17,13 @@ | |||
| 17 | 17 | ||
| 18 | #include "../Compress/CopyCoder.h" | 18 | #include "../Compress/CopyCoder.h" |
| 19 | 19 | ||
| 20 | // #define Z7_ELF_SHOW_DETAILS | ||
| 21 | |||
| 20 | using namespace NWindows; | 22 | using namespace NWindows; |
| 21 | 23 | ||
| 22 | static UInt16 Get16(const Byte *p, bool be) { if (be) return GetBe16(p); return GetUi16(p); } | 24 | static UInt16 Get16(const Byte *p, bool be) { if (be) return GetBe16a(p); return GetUi16a(p); } |
| 23 | static UInt32 Get32(const Byte *p, bool be) { if (be) return GetBe32(p); return GetUi32(p); } | 25 | static UInt32 Get32(const Byte *p, bool be) { if (be) return GetBe32a(p); return GetUi32a(p); } |
| 24 | static UInt64 Get64(const Byte *p, bool be) { if (be) return GetBe64(p); return GetUi64(p); } | 26 | static UInt64 Get64(const Byte *p, bool be) { if (be) return GetBe64a(p); return GetUi64a(p); } |
| 25 | 27 | ||
| 26 | #define G16(offs, v) v = Get16(p + (offs), be) | 28 | #define G16(offs, v) v = Get16(p + (offs), be) |
| 27 | #define G32(offs, v) v = Get32(p + (offs), be) | 29 | #define G32(offs, v) v = Get32(p + (offs), be) |
| @@ -31,14 +33,51 @@ namespace NArchive { | |||
| 31 | namespace NElf { | 33 | namespace NElf { |
| 32 | 34 | ||
| 33 | /* | 35 | /* |
| 34 | ELF Structure for most files (real order can be different): | 36 | ELF Structure example: |
| 35 | Header | 37 | { |
| 36 | Program (segment) header table (used at runtime) | 38 | Header |
| 37 | Segment1 (Section ... Section) | 39 | Program header table (is used at runtime) (list of segment metadata records) |
| 38 | Segment2 | 40 | { |
| 39 | ... | 41 | Segment (Read) |
| 40 | SegmentN | 42 | Segment : PT_PHDR : header table itself |
| 41 | Section header table (the data for linking and relocation) | 43 | Segment : PT_INTERP |
| 44 | Segment : PT_NOTE | ||
| 45 | .rela.dyn (RELA, ALLOC) | ||
| 46 | Segment (Execute/Read) | ||
| 47 | .text section (PROGBITS, SHF_ALLOC | SHF_EXECINSTR) | ||
| 48 | Segment (Read) | ||
| 49 | .rodata (PROGBITS, SHF_ALLOC | SHF_WRITE) | ||
| 50 | Segment : PT_GNU_EH_FRAME | ||
| 51 | .eh_frame_hdr | ||
| 52 | .eh_frame | ||
| 53 | .gcc_except_table | ||
| 54 | ... | ||
| 55 | Segment (Write/Read) (VaSize > Size) | ||
| 56 | Segment (Read) : PT_GNU_RELRO | ||
| 57 | Segment (Write/Read) | ||
| 58 | .data | ||
| 59 | .bss (Size == 0) (VSize != 0) | ||
| 60 | } | ||
| 61 | .comment (VA == 0) | ||
| 62 | .shstrtab (VA == 0) | ||
| 63 | Section header table (the data for linking and relocation) | ||
| 64 | } | ||
| 65 | |||
| 66 | Last top level segment contains .bss section that requires additional VA space. | ||
| 67 | So (VaSize > Size) for that segment. | ||
| 68 | |||
| 69 | Segments can be unsorted (by offset) in table. | ||
| 70 | Top level segments has Type=PT_LOAD : "Loadable segment". | ||
| 71 | Top level segments usually are aligned for page size (4 KB). | ||
| 72 | Another segments (non PT_LOAD segments) are inside PT_LOAD segments. | ||
| 73 | |||
| 74 | (VA-offset == 0) is possible for some sections and segments at the beginning of file. | ||
| 75 | (VA-offset == 4KB*N) for most sections and segments where (Size != 0), | ||
| 76 | (VA-offset != 4KB*N) for .bss section (last section), because (Size == 0), | ||
| 77 | and that section is not mapped from image file. | ||
| 78 | Some files contain additional "virtual" 4 KB page in VA space after | ||
| 79 | end of data of top level segments (PT_LOAD) before new top level segments. | ||
| 80 | So (VA-offset) value can increase by 4 KB step. | ||
| 42 | */ | 81 | */ |
| 43 | 82 | ||
| 44 | #define ELF_CLASS_32 1 | 83 | #define ELF_CLASS_32 1 |
| @@ -47,14 +86,14 @@ namespace NElf { | |||
| 47 | #define ELF_DATA_2LSB 1 | 86 | #define ELF_DATA_2LSB 1 |
| 48 | #define ELF_DATA_2MSB 2 | 87 | #define ELF_DATA_2MSB 2 |
| 49 | 88 | ||
| 50 | static const UInt32 kHeaderSize32 = 0x34; | 89 | static const unsigned kHeaderSize32 = 0x34; |
| 51 | static const UInt32 kHeaderSize64 = 0x40; | 90 | static const unsigned kHeaderSize64 = 0x40; |
| 52 | 91 | ||
| 53 | static const UInt32 kSegmentSize32 = 0x20; | 92 | static const unsigned kSegmentSize32 = 0x20; |
| 54 | static const UInt32 kSegmentSize64 = 0x38; | 93 | static const unsigned kSegmentSize64 = 0x38; |
| 55 | 94 | ||
| 56 | static const UInt32 kSectionSize32 = 0x28; | 95 | static const unsigned kSectionSize32 = 0x28; |
| 57 | static const UInt32 kSectionSize64 = 0x40; | 96 | static const unsigned kSectionSize64 = 0x40; |
| 58 | 97 | ||
| 59 | struct CHeader | 98 | struct CHeader |
| 60 | { | 99 | { |
| @@ -78,9 +117,9 @@ struct CHeader | |||
| 78 | UInt16 NumSections; | 117 | UInt16 NumSections; |
| 79 | UInt16 NamesSectIndex; | 118 | UInt16 NamesSectIndex; |
| 80 | 119 | ||
| 81 | bool Parse(const Byte *buf); | 120 | bool Parse(const Byte *p); |
| 82 | 121 | ||
| 83 | UInt64 GetHeadersSize() const { return (UInt64)HeaderSize + | 122 | UInt32 GetHeadersSize() const { return (UInt32)HeaderSize + |
| 84 | (UInt32)NumSegments * SegmentEntrySize + | 123 | (UInt32)NumSegments * SegmentEntrySize + |
| 85 | (UInt32)NumSections * SectionEntrySize; } | 124 | (UInt32)NumSections * SectionEntrySize; } |
| 86 | }; | 125 | }; |
| @@ -104,7 +143,7 @@ bool CHeader::Parse(const Byte *p) | |||
| 104 | if (p[6] != 1) // Version | 143 | if (p[6] != 1) // Version |
| 105 | return false; | 144 | return false; |
| 106 | Os = p[7]; | 145 | Os = p[7]; |
| 107 | AbiVer = p[8]; | 146 | // AbiVer = p[8]; |
| 108 | for (int i = 9; i < 16; i++) | 147 | for (int i = 9; i < 16; i++) |
| 109 | if (p[i] != 0) | 148 | if (p[i] != 0) |
| 110 | return false; | 149 | return false; |
| @@ -117,16 +156,21 @@ bool CHeader::Parse(const Byte *p) | |||
| 117 | if (Mode64) | 156 | if (Mode64) |
| 118 | { | 157 | { |
| 119 | // G64(0x18, EntryVa); | 158 | // G64(0x18, EntryVa); |
| 120 | G64(0x20, ProgOffset); | 159 | G64(0x20, ProgOffset); // == kHeaderSize64 == 0x40 usually |
| 121 | G64(0x28, SectOffset); | 160 | G64(0x28, SectOffset); |
| 122 | p += 0x30; | 161 | p += 0x30; |
| 162 | // we expect that fields are aligned | ||
| 163 | if (ProgOffset & 7) return false; | ||
| 164 | if (SectOffset & 7) return false; | ||
| 123 | } | 165 | } |
| 124 | else | 166 | else |
| 125 | { | 167 | { |
| 126 | // G32(0x18, EntryVa); | 168 | // G32(0x18, EntryVa); |
| 127 | G32(0x1C, ProgOffset); | 169 | G32(0x1C, ProgOffset); // == kHeaderSize32 == 0x34 usually |
| 128 | G32(0x20, SectOffset); | 170 | G32(0x20, SectOffset); |
| 129 | p += 0x24; | 171 | p += 0x24; |
| 172 | if (ProgOffset & 3) return false; | ||
| 173 | if (SectOffset & 3) return false; | ||
| 130 | } | 174 | } |
| 131 | 175 | ||
| 132 | G32(0, Flags); | 176 | G32(0, Flags); |
| @@ -140,21 +184,20 @@ bool CHeader::Parse(const Byte *p) | |||
| 140 | G16(12, NumSections); | 184 | G16(12, NumSections); |
| 141 | G16(14, NamesSectIndex); | 185 | G16(14, NamesSectIndex); |
| 142 | 186 | ||
| 143 | if (ProgOffset < HeaderSize && (ProgOffset != 0 || NumSegments != 0)) return false; | 187 | if (ProgOffset < HeaderSize && (ProgOffset || NumSegments)) return false; |
| 144 | if (SectOffset < HeaderSize && (SectOffset != 0 || NumSections != 0)) return false; | 188 | if (SectOffset < HeaderSize && (SectOffset || NumSections)) return false; |
| 145 | 189 | ||
| 146 | if (SegmentEntrySize == 0) { if (NumSegments != 0) return false; } | 190 | if (SegmentEntrySize == 0) { if (NumSegments) return false; } |
| 147 | else if (SegmentEntrySize != (Mode64 ? kSegmentSize64 : kSegmentSize32)) return false; | 191 | else if (SegmentEntrySize != (Mode64 ? kSegmentSize64 : kSegmentSize32)) return false; |
| 148 | 192 | ||
| 149 | if (SectionEntrySize == 0) { if (NumSections != 0) return false; } | 193 | if (SectionEntrySize == 0) { if (NumSections) return false; } |
| 150 | else if (SectionEntrySize != (Mode64 ? kSectionSize64 : kSectionSize32)) return false; | 194 | else if (SectionEntrySize != (Mode64 ? kSectionSize64 : kSectionSize32)) return false; |
| 151 | 195 | ||
| 152 | return true; | 196 | return true; |
| 153 | } | 197 | } |
| 154 | 198 | ||
| 155 | // The program header table itself. | ||
| 156 | 199 | ||
| 157 | #define PT_PHDR 6 | 200 | #define PT_PHDR 6 // The program header table itself. |
| 158 | #define PT_GNU_STACK 0x6474e551 | 201 | #define PT_GNU_STACK 0x6474e551 |
| 159 | 202 | ||
| 160 | static const CUInt32PCharPair g_SegnmentTypes[] = | 203 | static const CUInt32PCharPair g_SegnmentTypes[] = |
| @@ -186,16 +229,18 @@ struct CSegment | |||
| 186 | UInt32 Flags; | 229 | UInt32 Flags; |
| 187 | UInt64 Offset; | 230 | UInt64 Offset; |
| 188 | UInt64 Va; | 231 | UInt64 Va; |
| 189 | // UInt64 Pa; | 232 | UInt64 Size; // size in file |
| 190 | UInt64 Size; | 233 | UInt64 VSize; // size in memory |
| 191 | UInt64 VSize; | 234 | #ifdef Z7_ELF_SHOW_DETAILS |
| 192 | UInt64 Align; | 235 | UInt64 Pa; // usually == Va, or == 0 |
| 193 | 236 | UInt64 Align; // if (Align != 0), condition must be met: | |
| 237 | // (VSize % Align == Offset % Alig) | ||
| 238 | #endif | ||
| 194 | void UpdateTotalSize(UInt64 &totalSize) | 239 | void UpdateTotalSize(UInt64 &totalSize) |
| 195 | { | 240 | { |
| 196 | UInt64 t = Offset + Size; | 241 | const UInt64 t = Offset + Size; |
| 197 | if (totalSize < t) | 242 | if (totalSize < t) |
| 198 | totalSize = t; | 243 | totalSize = t; |
| 199 | } | 244 | } |
| 200 | void Parse(const Byte *p, bool mode64, bool be); | 245 | void Parse(const Byte *p, bool mode64, bool be); |
| 201 | }; | 246 | }; |
| @@ -208,20 +253,24 @@ void CSegment::Parse(const Byte *p, bool mode64, bool be) | |||
| 208 | G32(4, Flags); | 253 | G32(4, Flags); |
| 209 | G64(8, Offset); | 254 | G64(8, Offset); |
| 210 | G64(0x10, Va); | 255 | G64(0x10, Va); |
| 211 | // G64(0x18, Pa); | ||
| 212 | G64(0x20, Size); | 256 | G64(0x20, Size); |
| 213 | G64(0x28, VSize); | 257 | G64(0x28, VSize); |
| 258 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 259 | G64(0x18, Pa); | ||
| 214 | G64(0x30, Align); | 260 | G64(0x30, Align); |
| 261 | #endif | ||
| 215 | } | 262 | } |
| 216 | else | 263 | else |
| 217 | { | 264 | { |
| 218 | G32(4, Offset); | 265 | G32(4, Offset); |
| 219 | G32(8, Va); | 266 | G32(8, Va); |
| 220 | // G32(0x0C, Pa); | ||
| 221 | G32(0x10, Size); | 267 | G32(0x10, Size); |
| 222 | G32(0x14, VSize); | 268 | G32(0x14, VSize); |
| 223 | G32(0x18, Flags); | 269 | G32(0x18, Flags); |
| 270 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 271 | G32(0x0C, Pa); | ||
| 224 | G32(0x1C, Align); | 272 | G32(0x1C, Align); |
| 273 | #endif | ||
| 225 | } | 274 | } |
| 226 | } | 275 | } |
| 227 | 276 | ||
| @@ -290,6 +339,8 @@ static const CUInt32PCharPair g_SectTypes[] = | |||
| 290 | { 0x70000005, "ARM_OVERLAYSECTION" } | 339 | { 0x70000005, "ARM_OVERLAYSECTION" } |
| 291 | }; | 340 | }; |
| 292 | 341 | ||
| 342 | |||
| 343 | // SHF_ flags | ||
| 293 | static const CUInt32PCharPair g_SectionFlags[] = | 344 | static const CUInt32PCharPair g_SectionFlags[] = |
| 294 | { | 345 | { |
| 295 | { 0, "WRITE" }, | 346 | { 0, "WRITE" }, |
| @@ -303,7 +354,7 @@ static const CUInt32PCharPair g_SectionFlags[] = | |||
| 303 | { 8, "OS_NONCONFORMING" }, | 354 | { 8, "OS_NONCONFORMING" }, |
| 304 | { 9, "GROUP" }, | 355 | { 9, "GROUP" }, |
| 305 | { 10, "TLS" }, | 356 | { 10, "TLS" }, |
| 306 | { 11, "CP_SECTION" }, | 357 | { 11, "COMPRESSED" }, |
| 307 | { 12, "DP_SECTION" }, | 358 | { 12, "DP_SECTION" }, |
| 308 | { 13, "XCORE_SHF_CP_SECTION" }, | 359 | { 13, "XCORE_SHF_CP_SECTION" }, |
| 309 | { 28, "64_LARGE" }, | 360 | { 28, "64_LARGE" }, |
| @@ -326,9 +377,9 @@ struct CSection | |||
| 326 | 377 | ||
| 327 | void UpdateTotalSize(UInt64 &totalSize) | 378 | void UpdateTotalSize(UInt64 &totalSize) |
| 328 | { | 379 | { |
| 329 | UInt64 t = Offset + GetSize(); | 380 | const UInt64 t = Offset + GetSize(); |
| 330 | if (totalSize < t) | 381 | if (totalSize < t) |
| 331 | totalSize = t; | 382 | totalSize = t; |
| 332 | } | 383 | } |
| 333 | bool Parse(const Byte *p, bool mode64, bool be); | 384 | bool Parse(const Byte *p, bool mode64, bool be); |
| 334 | }; | 385 | }; |
| @@ -412,7 +463,7 @@ static const char * const g_Machines[] = | |||
| 412 | , "TRW RH-32" | 463 | , "TRW RH-32" |
| 413 | , "Motorola RCE" | 464 | , "Motorola RCE" |
| 414 | , "ARM" | 465 | , "ARM" |
| 415 | , "Alpha" | 466 | , "Alpha-STD" |
| 416 | , "Hitachi SH" | 467 | , "Hitachi SH" |
| 417 | , "SPARC-V9" | 468 | , "SPARC-V9" |
| 418 | , "Siemens Tricore" | 469 | , "Siemens Tricore" |
| @@ -577,8 +628,8 @@ static const char * const g_Machines[] = | |||
| 577 | static const CUInt32PCharPair g_MachinePairs[] = | 628 | static const CUInt32PCharPair g_MachinePairs[] = |
| 578 | { | 629 | { |
| 579 | { 243, "RISC-V" }, | 630 | { 243, "RISC-V" }, |
| 580 | { 47787, "Xilinx MicroBlaze" } | 631 | { 0x9026, "Alpha" }, // EM_ALPHA_EXP, obsolete, (used by NetBSD/alpha) (written in the absence of an ABI) |
| 581 | // { 0x9026, "Alpha" } | 632 | { 0xbaab, "Xilinx MicroBlaze" } |
| 582 | }; | 633 | }; |
| 583 | 634 | ||
| 584 | static const CUInt32PCharPair g_OS[] = | 635 | static const CUInt32PCharPair g_OS[] = |
| @@ -600,6 +651,8 @@ static const CUInt32PCharPair g_OS[] = | |||
| 600 | { 14, "HP NSK" }, | 651 | { 14, "HP NSK" }, |
| 601 | { 15, "AROS" }, | 652 | { 15, "AROS" }, |
| 602 | { 16, "FenixOS" }, | 653 | { 16, "FenixOS" }, |
| 654 | { 17, "CloudABI" }, | ||
| 655 | { 18, "OpenVOS" }, | ||
| 603 | { 64, "Bare-metal TMS320C6000" }, | 656 | { 64, "Bare-metal TMS320C6000" }, |
| 604 | { 65, "Linux TMS320C6000" }, | 657 | { 65, "Linux TMS320C6000" }, |
| 605 | { 97, "ARM" }, | 658 | { 97, "ARM" }, |
| @@ -693,23 +746,27 @@ public: | |||
| 693 | void CHandler::GetSectionName(UInt32 index, NCOM::CPropVariant &prop, bool showNULL) const | 746 | void CHandler::GetSectionName(UInt32 index, NCOM::CPropVariant &prop, bool showNULL) const |
| 694 | { | 747 | { |
| 695 | if (index >= _sections.Size()) | 748 | if (index >= _sections.Size()) |
| 696 | return; | 749 | prop = index; // it's possible for some file, but maybe it's ERROR case |
| 697 | const CSection §ion = _sections[index]; | 750 | else |
| 698 | const UInt32 offset = section.Name; | ||
| 699 | if (index == SHN_UNDEF /* && section.Type == SHT_NULL && offset == 0 */) | ||
| 700 | { | 751 | { |
| 701 | if (showNULL) | 752 | const CSection §ion = _sections[index]; |
| 702 | prop = "NULL"; | 753 | const UInt32 offset = section.Name; |
| 703 | return; | 754 | if (index == SHN_UNDEF /* && section.Type == SHT_NULL && offset == 0 */) |
| 704 | } | ||
| 705 | const Byte *p = _namesData; | ||
| 706 | size_t size = _namesData.Size(); | ||
| 707 | for (size_t i = offset; i < size; i++) | ||
| 708 | if (p[i] == 0) | ||
| 709 | { | 755 | { |
| 710 | prop = (const char *)(p + offset); | 756 | if (showNULL) |
| 757 | prop = "NULL"; | ||
| 711 | return; | 758 | return; |
| 712 | } | 759 | } |
| 760 | const Byte *p = _namesData; | ||
| 761 | const size_t size = _namesData.Size(); | ||
| 762 | for (size_t i = offset; i < size; i++) | ||
| 763 | if (p[i] == 0) | ||
| 764 | { | ||
| 765 | prop = (const char *)(p + offset); | ||
| 766 | return; | ||
| 767 | } | ||
| 768 | prop = "ERROR"; | ||
| 769 | } | ||
| 713 | } | 770 | } |
| 714 | 771 | ||
| 715 | static const Byte kArcProps[] = | 772 | static const Byte kArcProps[] = |
| @@ -726,7 +783,14 @@ static const Byte kArcProps[] = | |||
| 726 | enum | 783 | enum |
| 727 | { | 784 | { |
| 728 | kpidLinkSection = kpidUserDefined, | 785 | kpidLinkSection = kpidUserDefined, |
| 729 | kpidInfoSection | 786 | kpidInfoSection, |
| 787 | kpidEntrySize | ||
| 788 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 789 | // , kpidAlign | ||
| 790 | , kpidPa | ||
| 791 | , kpidDelta | ||
| 792 | , kpidOffsetEnd | ||
| 793 | #endif | ||
| 730 | }; | 794 | }; |
| 731 | 795 | ||
| 732 | static const CStatProp kProps[] = | 796 | static const CStatProp kProps[] = |
| @@ -738,6 +802,14 @@ static const CStatProp kProps[] = | |||
| 738 | { NULL, kpidVa, VT_UI8 }, | 802 | { NULL, kpidVa, VT_UI8 }, |
| 739 | { NULL, kpidType, VT_BSTR }, | 803 | { NULL, kpidType, VT_BSTR }, |
| 740 | { NULL, kpidCharacts, VT_BSTR } | 804 | { NULL, kpidCharacts, VT_BSTR } |
| 805 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 806 | // , { "Align", kpidAlign, VT_UI8 } | ||
| 807 | , { NULL, kpidClusterSize, VT_UI8 } | ||
| 808 | , { "PA", kpidPa, VT_UI8 } | ||
| 809 | , { "End offset", kpidOffsetEnd, VT_UI8 } | ||
| 810 | , { "Delta (VA-Offset)", kpidDelta, VT_UI8 } | ||
| 811 | #endif | ||
| 812 | , { "Entry Size", kpidEntrySize, VT_UI8} | ||
| 741 | , { "Link Section", kpidLinkSection, VT_BSTR} | 813 | , { "Link Section", kpidLinkSection, VT_BSTR} |
| 742 | , { "Info Section", kpidInfoSection, VT_BSTR} | 814 | , { "Info Section", kpidInfoSection, VT_BSTR} |
| 743 | }; | 815 | }; |
| @@ -769,7 +841,7 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)) | |||
| 769 | if (s.IsEmpty()) | 841 | if (s.IsEmpty()) |
| 770 | s = TypePairToString(g_MachinePairs, Z7_ARRAY_SIZE(g_MachinePairs), _header.Machine); | 842 | s = TypePairToString(g_MachinePairs, Z7_ARRAY_SIZE(g_MachinePairs), _header.Machine); |
| 771 | UInt32 flags = _header.Flags; | 843 | UInt32 flags = _header.Flags; |
| 772 | if (flags != 0) | 844 | if (flags) |
| 773 | { | 845 | { |
| 774 | s.Add_Space(); | 846 | s.Add_Space(); |
| 775 | if (_header.Machine == k_Machine_ARM) | 847 | if (_header.Machine == k_Machine_ARM) |
| @@ -783,10 +855,10 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)) | |||
| 783 | const UInt32 ver = flags >> 28; | 855 | const UInt32 ver = flags >> 28; |
| 784 | s += "v"; | 856 | s += "v"; |
| 785 | s.Add_UInt32(ver); | 857 | s.Add_UInt32(ver); |
| 786 | flags &= (((UInt32)1 << 28) - 1); | 858 | flags &= ((UInt32)1 << 28) - 1; |
| 787 | 859 | ||
| 788 | UInt32 abi = (flags >> 12) & 7; | 860 | const UInt32 abi = (flags >> 12) & 7; |
| 789 | if (abi != 0) | 861 | if (abi) |
| 790 | { | 862 | { |
| 791 | s += " ABI:"; | 863 | s += " ABI:"; |
| 792 | s.Add_UInt32(abi); | 864 | s.Add_UInt32(abi); |
| @@ -827,13 +899,39 @@ Z7_COM7F_IMF(CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value)) | |||
| 827 | case kpidHostOS: PAIR_TO_PROP(g_OS, _header.Os, prop); break; | 899 | case kpidHostOS: PAIR_TO_PROP(g_OS, _header.Os, prop); break; |
| 828 | case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break; | 900 | case kpidCharacts: TYPE_TO_PROP(g_Types, _header.Type, prop); break; |
| 829 | case kpidComment: | 901 | case kpidComment: |
| 902 | { | ||
| 903 | AString s; | ||
| 830 | if (_stackFlags_Defined) | 904 | if (_stackFlags_Defined) |
| 831 | { | 905 | { |
| 832 | AString s ("STACK: "); | 906 | s += "STACK: "; |
| 833 | s += FlagsToString(g_SegmentFlags, Z7_ARRAY_SIZE(g_SegmentFlags), _stackFlags); | 907 | s += FlagsToString(g_SegmentFlags, Z7_ARRAY_SIZE(g_SegmentFlags), _stackFlags); |
| 834 | prop = s; | 908 | s.Add_LF(); |
| 909 | /* | ||
| 910 | if (_header.EntryVa) | ||
| 911 | { | ||
| 912 | s += "Entry point: 0x"; | ||
| 913 | char temp[16 + 4]; | ||
| 914 | ConvertUInt64ToHex(_header.EntryVa, temp); | ||
| 915 | s += temp; | ||
| 916 | s.Add_LF(); | ||
| 917 | } | ||
| 918 | */ | ||
| 919 | } | ||
| 920 | if (_header.NumSegments) | ||
| 921 | { | ||
| 922 | s += "Segments: "; | ||
| 923 | s.Add_UInt32(_header.NumSegments); | ||
| 924 | s.Add_LF(); | ||
| 925 | } | ||
| 926 | if (_header.NumSections) | ||
| 927 | { | ||
| 928 | s += "Sections: "; | ||
| 929 | s.Add_UInt32(_header.NumSections); | ||
| 930 | s.Add_LF(); | ||
| 835 | } | 931 | } |
| 932 | prop = s; | ||
| 836 | break; | 933 | break; |
| 934 | } | ||
| 837 | case kpidExtension: | 935 | case kpidExtension: |
| 838 | { | 936 | { |
| 839 | const char *s = NULL; | 937 | const char *s = NULL; |
| @@ -878,12 +976,17 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val | |||
| 878 | } | 976 | } |
| 879 | case kpidOffset: prop = item.Offset; break; | 977 | case kpidOffset: prop = item.Offset; break; |
| 880 | case kpidVa: prop = item.Va; break; | 978 | case kpidVa: prop = item.Va; break; |
| 979 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 980 | case kpidDelta: if (item.Va) { prop = item.Va - item.Offset; } break; | ||
| 981 | case kpidOffsetEnd: prop = item.Offset + item.Size; break; | ||
| 982 | case kpidPa: prop = item.Pa; break; | ||
| 983 | case kpidClusterSize: prop = item.Align; break; | ||
| 984 | #endif | ||
| 881 | case kpidSize: | 985 | case kpidSize: |
| 882 | case kpidPackSize: prop = (UInt64)item.Size; break; | 986 | case kpidPackSize: prop = (UInt64)item.Size; break; |
| 883 | case kpidVirtualSize: prop = (UInt64)item.VSize; break; | 987 | case kpidVirtualSize: prop = (UInt64)item.VSize; break; |
| 884 | case kpidType: PAIR_TO_PROP(g_SegnmentTypes, item.Type, prop); break; | 988 | case kpidType: PAIR_TO_PROP(g_SegnmentTypes, item.Type, prop); break; |
| 885 | case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break; | 989 | case kpidCharacts: FLAGS_TO_PROP(g_SegmentFlags, item.Flags, prop); break; |
| 886 | |||
| 887 | } | 990 | } |
| 888 | } | 991 | } |
| 889 | else | 992 | else |
| @@ -895,13 +998,19 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val | |||
| 895 | case kpidPath: GetSectionName(index, prop, true); break; | 998 | case kpidPath: GetSectionName(index, prop, true); break; |
| 896 | case kpidOffset: prop = item.Offset; break; | 999 | case kpidOffset: prop = item.Offset; break; |
| 897 | case kpidVa: prop = item.Va; break; | 1000 | case kpidVa: prop = item.Va; break; |
| 1001 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 1002 | case kpidDelta: if (item.Va) { prop = item.Va - item.Offset; } break; | ||
| 1003 | case kpidOffsetEnd: prop = item.Offset + item.GetSize(); break; | ||
| 1004 | #endif | ||
| 898 | case kpidSize: | 1005 | case kpidSize: |
| 899 | case kpidPackSize: prop = (UInt64)(item.Type == SHT_NOBITS ? 0 : item.VSize); break; | 1006 | case kpidPackSize: prop = (UInt64)(item.Type == SHT_NOBITS ? 0 : item.VSize); break; |
| 900 | case kpidVirtualSize: prop = item.GetSize(); break; | 1007 | case kpidVirtualSize: prop = item.GetSize(); break; |
| 901 | case kpidType: PAIR_TO_PROP(g_SectTypes, item.Type, prop); break; | 1008 | case kpidType: PAIR_TO_PROP(g_SectTypes, item.Type, prop); break; |
| 902 | case kpidCharacts: FLAGS_TO_PROP(g_SectionFlags, (UInt32)item.Flags, prop); break; | 1009 | case kpidCharacts: FLAGS_TO_PROP(g_SectionFlags, (UInt32)item.Flags, prop); break; |
| 1010 | // case kpidAlign: prop = item.Align; break; | ||
| 903 | case kpidLinkSection: GetSectionName(item.Link, prop, false); break; | 1011 | case kpidLinkSection: GetSectionName(item.Link, prop, false); break; |
| 904 | case kpidInfoSection: GetSectionName(item.Info, prop, false); break; | 1012 | case kpidInfoSection: GetSectionName(item.Info, prop, false); break; |
| 1013 | case kpidEntrySize: prop = (UInt64)item.EntSize; break; | ||
| 905 | } | 1014 | } |
| 906 | } | 1015 | } |
| 907 | prop.Detach(value); | 1016 | prop.Detach(value); |
| @@ -911,42 +1020,46 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val | |||
| 911 | 1020 | ||
| 912 | HRESULT CHandler::Open2(IInStream *stream) | 1021 | HRESULT CHandler::Open2(IInStream *stream) |
| 913 | { | 1022 | { |
| 914 | const UInt32 kStartSize = kHeaderSize64; | 1023 | { |
| 915 | Byte h[kStartSize]; | 1024 | const UInt32 kStartSize = kHeaderSize64; |
| 916 | RINOK(ReadStream_FALSE(stream, h, kStartSize)) | 1025 | UInt64 h64[kStartSize / 8]; |
| 917 | if (h[0] != 0x7F || h[1] != 'E' || h[2] != 'L' || h[3] != 'F') | 1026 | RINOK(ReadStream_FALSE(stream, h64, kStartSize)) |
| 918 | return S_FALSE; | 1027 | const Byte *h = (const Byte *)(const void *)h64; |
| 919 | if (!_header.Parse(h)) | 1028 | if (GetUi32a(h) != 0x464c457f) |
| 920 | return S_FALSE; | 1029 | return S_FALSE; |
| 1030 | if (!_header.Parse(h)) | ||
| 1031 | return S_FALSE; | ||
| 1032 | } | ||
| 921 | 1033 | ||
| 922 | _totalSize = _header.HeaderSize; | 1034 | _totalSize = _header.HeaderSize; |
| 923 | 1035 | ||
| 924 | bool addSegments = false; | 1036 | bool addSegments = false; |
| 925 | bool addSections = false; | 1037 | bool addSections = false; |
| 926 | 1038 | // first section usually is NULL (with zero offsets and zero sizes). | |
| 927 | if (_header.NumSections > 1) | 1039 | if (_header.NumSegments == 0 || _header.NumSections > 1) |
| 928 | addSections = true; | 1040 | addSections = true; |
| 929 | else | 1041 | else |
| 930 | addSegments = true; | 1042 | addSegments = true; |
| 1043 | #ifdef Z7_ELF_SHOW_DETAILS | ||
| 1044 | addSections = true; | ||
| 1045 | addSegments = true; | ||
| 1046 | #endif | ||
| 931 | 1047 | ||
| 932 | if (_header.NumSegments != 0) | 1048 | if (_header.NumSegments) |
| 933 | { | 1049 | { |
| 934 | if (_header.ProgOffset > (UInt64)1 << 60) return S_FALSE; | 1050 | if (_header.ProgOffset > (UInt64)1 << 60) return S_FALSE; |
| 935 | RINOK(InStream_SeekSet(stream, _header.ProgOffset)) | 1051 | RINOK(InStream_SeekSet(stream, _header.ProgOffset)) |
| 936 | const size_t size = (size_t)_header.SegmentEntrySize * _header.NumSegments; | 1052 | const size_t size = (size_t)_header.SegmentEntrySize * _header.NumSegments; |
| 937 | |||
| 938 | CByteArr buf(size); | 1053 | CByteArr buf(size); |
| 939 | |||
| 940 | RINOK(ReadStream_FALSE(stream, buf, size)) | 1054 | RINOK(ReadStream_FALSE(stream, buf, size)) |
| 941 | 1055 | { | |
| 942 | const UInt64 total = _header.ProgOffset + size; | 1056 | const UInt64 total = _header.ProgOffset + size; |
| 943 | if (_totalSize < total) | 1057 | if (_totalSize < total) |
| 944 | _totalSize = total; | 1058 | _totalSize = total; |
| 945 | 1059 | } | |
| 946 | const Byte *p = buf; | ||
| 947 | |||
| 948 | if (addSegments) | 1060 | if (addSegments) |
| 949 | _segments.ClearAndReserve(_header.NumSegments); | 1061 | _segments.ClearAndReserve(_header.NumSegments); |
| 1062 | const Byte *p = buf; | ||
| 950 | for (unsigned i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize) | 1063 | for (unsigned i = 0; i < _header.NumSegments; i++, p += _header.SegmentEntrySize) |
| 951 | { | 1064 | { |
| 952 | CSegment seg; | 1065 | CSegment seg; |
| @@ -957,29 +1070,29 @@ HRESULT CHandler::Open2(IInStream *stream) | |||
| 957 | _stackFlags = seg.Flags; | 1070 | _stackFlags = seg.Flags; |
| 958 | _stackFlags_Defined = true; | 1071 | _stackFlags_Defined = true; |
| 959 | } | 1072 | } |
| 960 | if (addSegments && seg.Type != PT_PHDR) | 1073 | if (addSegments |
| 1074 | // we don't show program header table segment | ||
| 1075 | && seg.Type != PT_PHDR | ||
| 1076 | ) | ||
| 961 | _segments.AddInReserved(seg); | 1077 | _segments.AddInReserved(seg); |
| 962 | } | 1078 | } |
| 963 | } | 1079 | } |
| 964 | 1080 | ||
| 965 | if (_header.NumSections != 0) | 1081 | if (_header.NumSections) |
| 966 | { | 1082 | { |
| 967 | if (_header.SectOffset > (UInt64)1 << 60) return S_FALSE; | 1083 | if (_header.SectOffset > (UInt64)1 << 60) return S_FALSE; |
| 968 | RINOK(InStream_SeekSet(stream, _header.SectOffset)) | 1084 | RINOK(InStream_SeekSet(stream, _header.SectOffset)) |
| 969 | size_t size = (size_t)_header.SectionEntrySize * _header.NumSections; | 1085 | const size_t size = (size_t)_header.SectionEntrySize * _header.NumSections; |
| 970 | |||
| 971 | CByteArr buf(size); | 1086 | CByteArr buf(size); |
| 972 | |||
| 973 | RINOK(ReadStream_FALSE(stream, buf, size)) | 1087 | RINOK(ReadStream_FALSE(stream, buf, size)) |
| 974 | 1088 | { | |
| 975 | UInt64 total = _header.SectOffset + size; | 1089 | const UInt64 total = _header.SectOffset + size; |
| 976 | if (_totalSize < total) | 1090 | if (_totalSize < total) |
| 977 | _totalSize = total; | 1091 | _totalSize = total; |
| 978 | 1092 | } | |
| 979 | const Byte *p = buf; | ||
| 980 | |||
| 981 | if (addSections) | 1093 | if (addSections) |
| 982 | _sections.ClearAndReserve(_header.NumSections); | 1094 | _sections.ClearAndReserve(_header.NumSections); |
| 1095 | const Byte *p = buf; | ||
| 983 | for (unsigned i = 0; i < _header.NumSections; i++, p += _header.SectionEntrySize) | 1096 | for (unsigned i = 0; i < _header.NumSections; i++, p += _header.SectionEntrySize) |
| 984 | { | 1097 | { |
| 985 | CSection sect; | 1098 | CSection sect; |
| @@ -1000,18 +1113,17 @@ HRESULT CHandler::Open2(IInStream *stream) | |||
| 1000 | { | 1113 | { |
| 1001 | const CSection § = _sections[_header.NamesSectIndex]; | 1114 | const CSection § = _sections[_header.NamesSectIndex]; |
| 1002 | const UInt64 size = sect.GetSize(); | 1115 | const UInt64 size = sect.GetSize(); |
| 1003 | if (size != 0 | 1116 | if (size && size < ((UInt64)1 << 31) |
| 1004 | && size < ((UInt64)1 << 31) | 1117 | && (Int64)sect.Offset >= 0) |
| 1005 | && (Int64)sect.Offset >= 0) | ||
| 1006 | { | 1118 | { |
| 1007 | _namesData.Alloc((size_t)size); | 1119 | _namesData.Alloc((size_t)size); |
| 1008 | RINOK(InStream_SeekSet(stream, sect.Offset)) | 1120 | RINOK(InStream_SeekSet(stream, sect.Offset)) |
| 1009 | RINOK(ReadStream_FALSE(stream, _namesData, (size_t)size)) | 1121 | RINOK(ReadStream_FALSE(stream, _namesData, (size_t)size)) |
| 1010 | } | 1122 | } |
| 1011 | } | 1123 | } |
| 1012 | |||
| 1013 | /* | 1124 | /* |
| 1014 | // we will not delete NULL sections, since we have links to section via indexes | 1125 | // we cannot delete "NULL" sections, |
| 1126 | // because we have links to sections array via indexes | ||
| 1015 | for (int i = _sections.Size() - 1; i >= 0; i--) | 1127 | for (int i = _sections.Size() - 1; i >= 0; i--) |
| 1016 | if (_sections[i].Type == SHT_NULL) | 1128 | if (_sections[i].Type == SHT_NULL) |
| 1017 | _items.Delete(i); | 1129 | _items.Delete(i); |
| @@ -1080,7 +1192,7 @@ Z7_COM7F_IMF(CHandler::Extract(const UInt32 *indices, UInt32 numItems, | |||
| 1080 | } | 1192 | } |
| 1081 | RINOK(extractCallback->SetTotal(totalSize)) | 1193 | RINOK(extractCallback->SetTotal(totalSize)) |
| 1082 | 1194 | ||
| 1083 | UInt64 currentTotalSize = 0; | 1195 | totalSize = 0; |
| 1084 | UInt64 currentItemSize; | 1196 | UInt64 currentItemSize; |
| 1085 | 1197 | ||
| 1086 | CMyComPtr2_Create<ICompressCoder, NCompress::CCopyCoder> copyCoder; | 1198 | CMyComPtr2_Create<ICompressCoder, NCompress::CCopyCoder> copyCoder; |
| @@ -1089,9 +1201,9 @@ Z7_COM7F_IMF(CHandler::Extract(const UInt32 *indices, UInt32 numItems, | |||
| 1089 | CMyComPtr2_Create<ISequentialInStream, CLimitedSequentialInStream> inStream; | 1201 | CMyComPtr2_Create<ISequentialInStream, CLimitedSequentialInStream> inStream; |
| 1090 | inStream->SetStream(_inStream); | 1202 | inStream->SetStream(_inStream); |
| 1091 | 1203 | ||
| 1092 | for (i = 0;; i++, currentTotalSize += currentItemSize) | 1204 | for (i = 0;; i++, totalSize += currentItemSize) |
| 1093 | { | 1205 | { |
| 1094 | lps->InSize = lps->OutSize = currentTotalSize; | 1206 | lps->InSize = lps->OutSize = totalSize; |
| 1095 | RINOK(lps->SetCur()) | 1207 | RINOK(lps->SetCur()) |
| 1096 | if (i >= numItems) | 1208 | if (i >= numItems) |
| 1097 | break; | 1209 | break; |
diff --git a/CPP/7zip/Archive/LzhHandler.cpp b/CPP/7zip/Archive/LzhHandler.cpp index adfe59d..8959300 100644 --- a/CPP/7zip/Archive/LzhHandler.cpp +++ b/CPP/7zip/Archive/LzhHandler.cpp | |||
| @@ -473,8 +473,8 @@ Z7_COM7F_IMF(CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *val | |||
| 473 | break; | 473 | break; |
| 474 | } | 474 | } |
| 475 | case kpidIsDir: prop = item.IsDir(); break; | 475 | case kpidIsDir: prop = item.IsDir(); break; |
| 476 | case kpidSize: prop = item.Size; break; | 476 | case kpidSize: prop = (UInt64)item.Size; break; |
| 477 | case kpidPackSize: prop = item.PackSize; break; | 477 | case kpidPackSize: prop = (UInt64)item.PackSize; break; |
| 478 | case kpidCRC: prop = (UInt32)item.CRC; break; | 478 | case kpidCRC: prop = (UInt32)item.CRC; break; |
| 479 | case kpidHostOS: PAIR_TO_PROP(g_OsPairs, item.OsId, prop); break; | 479 | case kpidHostOS: PAIR_TO_PROP(g_OsPairs, item.OsId, prop); break; |
| 480 | case kpidMTime: | 480 | case kpidMTime: |
diff --git a/CPP/7zip/Archive/UefiHandler.cpp b/CPP/7zip/Archive/UefiHandler.cpp index 9462e97..b224cdf 100644 --- a/CPP/7zip/Archive/UefiHandler.cpp +++ b/CPP/7zip/Archive/UefiHandler.cpp | |||
| @@ -1579,6 +1579,8 @@ HRESULT CHandler::OpenCapsule(IInStream *stream) | |||
| 1579 | || _h.CapsuleImageSize < _h.HeaderSize | 1579 | || _h.CapsuleImageSize < _h.HeaderSize |
| 1580 | || _h.OffsetToCapsuleBody < _h.HeaderSize | 1580 | || _h.OffsetToCapsuleBody < _h.HeaderSize |
| 1581 | || _h.OffsetToCapsuleBody > _h.CapsuleImageSize | 1581 | || _h.OffsetToCapsuleBody > _h.CapsuleImageSize |
| 1582 | || _h.CapsuleImageSize > (1u << 30) // to reduce false detection | ||
| 1583 | || _h.HeaderSize > (1u << 28) // to reduce false detection | ||
| 1582 | ) | 1584 | ) |
| 1583 | return S_FALSE; | 1585 | return S_FALSE; |
| 1584 | _phySize = _h.CapsuleImageSize; | 1586 | _phySize = _h.CapsuleImageSize; |
| @@ -1587,7 +1589,7 @@ HRESULT CHandler::OpenCapsule(IInStream *stream) | |||
| 1587 | _h.OffsetToSplitInformation != 0 ) | 1589 | _h.OffsetToSplitInformation != 0 ) |
| 1588 | return E_NOTIMPL; | 1590 | return E_NOTIMPL; |
| 1589 | 1591 | ||
| 1590 | unsigned bufIndex = AddBuf(_h.CapsuleImageSize); | 1592 | const unsigned bufIndex = AddBuf(_h.CapsuleImageSize); |
| 1591 | CByteBuffer &buf0 = _bufs[bufIndex]; | 1593 | CByteBuffer &buf0 = _bufs[bufIndex]; |
| 1592 | memcpy(buf0, buf, kHeaderSize); | 1594 | memcpy(buf0, buf, kHeaderSize); |
| 1593 | ReadStream_FALSE(stream, buf0 + kHeaderSize, _h.CapsuleImageSize - kHeaderSize); | 1595 | ReadStream_FALSE(stream, buf0 + kHeaderSize, _h.CapsuleImageSize - kHeaderSize); |
diff --git a/CPP/7zip/Bundles/SFXCon/SfxCon.cpp b/CPP/7zip/Bundles/SFXCon/SfxCon.cpp index cfce24d..aac4e28 100644 --- a/CPP/7zip/Bundles/SFXCon/SfxCon.cpp +++ b/CPP/7zip/Bundles/SFXCon/SfxCon.cpp | |||
| @@ -422,7 +422,7 @@ int Main2( | |||
| 422 | { | 422 | { |
| 423 | CExtractCallbackConsole *ecs = new CExtractCallbackConsole; | 423 | CExtractCallbackConsole *ecs = new CExtractCallbackConsole; |
| 424 | CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs; | 424 | CMyComPtr<IFolderArchiveExtractCallback> extractCallback = ecs; |
| 425 | ecs->Init(g_StdStream, &g_StdErr, g_StdStream); | 425 | ecs->Init(g_StdStream, &g_StdErr, g_StdStream, false); |
| 426 | 426 | ||
| 427 | #ifndef Z7_NO_CRYPTO | 427 | #ifndef Z7_NO_CRYPTO |
| 428 | ecs->PasswordIsDefined = passwordEnabled; | 428 | ecs->PasswordIsDefined = passwordEnabled; |
diff --git a/CPP/7zip/Compress/LzmsDecoder.cpp b/CPP/7zip/Compress/LzmsDecoder.cpp index 0f6d475..353798a 100644 --- a/CPP/7zip/Compress/LzmsDecoder.cpp +++ b/CPP/7zip/Compress/LzmsDecoder.cpp | |||
| @@ -196,29 +196,17 @@ static void x86_Filter(Byte *data, UInt32 size, Int32 *history) | |||
| 196 | 196 | ||
| 197 | const Byte b = p[0]; | 197 | const Byte b = p[0]; |
| 198 | 198 | ||
| 199 | if (b == 0x48) | 199 | if ((b & 0x80) == 0) // REX (0x48 or 0x4c) |
| 200 | { | 200 | { |
| 201 | if (p[1] == 0x8B) | 201 | const unsigned b2 = p[2] - 0x5; // [RIP + disp32] |
| 202 | if (b2 & 0x7) | ||
| 203 | continue; | ||
| 204 | if (p[1] != 0x8d) // LEA | ||
| 202 | { | 205 | { |
| 203 | if ((p[2] & 0xF7) != 0x5) | 206 | if (p[1] != 0x8b || b != 0x48 || (b2 & 0xf7)) |
| 204 | continue; | 207 | continue; |
| 205 | // MOV RAX / RCX, [RIP + disp32] | 208 | // MOV RAX / RCX, [RIP + disp32] |
| 206 | } | 209 | } |
| 207 | else if (p[1] == 0x8D) // LEA | ||
| 208 | { | ||
| 209 | if ((p[2] & 0x7) != 0x5) | ||
| 210 | continue; | ||
| 211 | // LEA R**, [] | ||
| 212 | } | ||
| 213 | else | ||
| 214 | continue; | ||
| 215 | codeLen = 3; | ||
| 216 | } | ||
| 217 | else if (b == 0x4C) | ||
| 218 | { | ||
| 219 | if (p[1] != 0x8D || (p[2] & 0x7) != 0x5) | ||
| 220 | continue; | ||
| 221 | // LEA R*, [] | ||
| 222 | codeLen = 3; | 210 | codeLen = 3; |
| 223 | } | 211 | } |
| 224 | else if (b == 0xE8) | 212 | else if (b == 0xE8) |
diff --git a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp index f35433b..556b25a 100644 --- a/CPP/7zip/UI/Common/ArchiveCommandLine.cpp +++ b/CPP/7zip/UI/Common/ArchiveCommandLine.cpp | |||
| @@ -1039,6 +1039,9 @@ void CArcCmdLineParser::Parse1(const UStringVector &commandStrings, | |||
| 1039 | options.TechMode = parser[NKey::kTechMode].ThereIs; | 1039 | options.TechMode = parser[NKey::kTechMode].ThereIs; |
| 1040 | options.ShowTime = parser[NKey::kShowTime].ThereIs; | 1040 | options.ShowTime = parser[NKey::kShowTime].ThereIs; |
| 1041 | 1041 | ||
| 1042 | if (parser[NKey::kDisablePercents].ThereIs) | ||
| 1043 | options.DisablePercents = true; | ||
| 1044 | |||
| 1042 | if (parser[NKey::kDisablePercents].ThereIs | 1045 | if (parser[NKey::kDisablePercents].ThereIs |
| 1043 | || options.StdOutMode | 1046 | || options.StdOutMode |
| 1044 | || !options.IsStdOutTerminal) | 1047 | || !options.IsStdOutTerminal) |
diff --git a/CPP/7zip/UI/Common/ArchiveCommandLine.h b/CPP/7zip/UI/Common/ArchiveCommandLine.h index acee63c..d17ec5a 100644 --- a/CPP/7zip/UI/Common/ArchiveCommandLine.h +++ b/CPP/7zip/UI/Common/ArchiveCommandLine.h | |||
| @@ -60,6 +60,8 @@ struct CArcCmdLineOptions | |||
| 60 | bool StdInMode; | 60 | bool StdInMode; |
| 61 | bool StdOutMode; | 61 | bool StdOutMode; |
| 62 | bool EnableHeaders; | 62 | bool EnableHeaders; |
| 63 | bool DisablePercents; | ||
| 64 | |||
| 63 | 65 | ||
| 64 | bool YesToAll; | 66 | bool YesToAll; |
| 65 | bool ShowDialog; | 67 | bool ShowDialog; |
| @@ -132,6 +134,7 @@ struct CArcCmdLineOptions | |||
| 132 | StdOutMode(false), | 134 | StdOutMode(false), |
| 133 | 135 | ||
| 134 | EnableHeaders(false), | 136 | EnableHeaders(false), |
| 137 | DisablePercents(false), | ||
| 135 | 138 | ||
| 136 | YesToAll(false), | 139 | YesToAll(false), |
| 137 | ShowDialog(false), | 140 | ShowDialog(false), |
diff --git a/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp b/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp index 66d7123..376fbf3 100644 --- a/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp +++ b/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp | |||
| @@ -343,7 +343,7 @@ Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation(const wchar_t *name, Int3 | |||
| 343 | default: s = "???"; requiredLevel = 2; | 343 | default: s = "???"; requiredLevel = 2; |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | bool show2 = (LogLevel >= requiredLevel && _so); | 346 | const bool show2 = (LogLevel >= requiredLevel && _so); |
| 347 | 347 | ||
| 348 | if (show2) | 348 | if (show2) |
| 349 | { | 349 | { |
| @@ -373,6 +373,7 @@ Z7_COM7F_IMF(CExtractCallbackConsole::PrepareOperation(const wchar_t *name, Int3 | |||
| 373 | 373 | ||
| 374 | if (NeedFlush) | 374 | if (NeedFlush) |
| 375 | _so->Flush(); | 375 | _so->Flush(); |
| 376 | // _so->Flush(); // for debug only | ||
| 376 | } | 377 | } |
| 377 | 378 | ||
| 378 | if (NeedPercents()) | 379 | if (NeedPercents()) |
diff --git a/CPP/7zip/UI/Console/ExtractCallbackConsole.h b/CPP/7zip/UI/Console/ExtractCallbackConsole.h index 8db80e7..4e45348 100644 --- a/CPP/7zip/UI/Console/ExtractCallbackConsole.h +++ b/CPP/7zip/UI/Console/ExtractCallbackConsole.h | |||
| @@ -44,7 +44,7 @@ class CExtractScanConsole Z7_final: public IDirItemsCallback | |||
| 44 | 44 | ||
| 45 | // CErrorPathCodes2 ScanErrors; | 45 | // CErrorPathCodes2 ScanErrors; |
| 46 | 46 | ||
| 47 | bool NeedPercents() const { return _percent._so != NULL; } | 47 | bool NeedPercents() const { return _percent._so && !_percent.DisablePrint; } |
| 48 | 48 | ||
| 49 | void ClosePercentsAndFlush() | 49 | void ClosePercentsAndFlush() |
| 50 | { | 50 | { |
| @@ -56,11 +56,16 @@ class CExtractScanConsole Z7_final: public IDirItemsCallback | |||
| 56 | 56 | ||
| 57 | public: | 57 | public: |
| 58 | 58 | ||
| 59 | void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream) | 59 | void Init( |
| 60 | CStdOutStream *outStream, | ||
| 61 | CStdOutStream *errorStream, | ||
| 62 | CStdOutStream *percentStream, | ||
| 63 | bool disablePercents) | ||
| 60 | { | 64 | { |
| 61 | _so = outStream; | 65 | _so = outStream; |
| 62 | _se = errorStream; | 66 | _se = errorStream; |
| 63 | _percent._so = percentStream; | 67 | _percent._so = percentStream; |
| 68 | _percent.DisablePrint = disablePercents; | ||
| 64 | } | 69 | } |
| 65 | 70 | ||
| 66 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } | 71 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } |
| @@ -177,9 +182,13 @@ public: | |||
| 177 | 182 | ||
| 178 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } | 183 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } |
| 179 | 184 | ||
| 180 | void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream) | 185 | void Init( |
| 186 | CStdOutStream *outStream, | ||
| 187 | CStdOutStream *errorStream, | ||
| 188 | CStdOutStream *percentStream, | ||
| 189 | bool disablePercents) | ||
| 181 | { | 190 | { |
| 182 | COpenCallbackConsole::Init(outStream, errorStream, percentStream); | 191 | COpenCallbackConsole::Init(outStream, errorStream, percentStream, disablePercents); |
| 183 | 192 | ||
| 184 | NumTryArcs = 0; | 193 | NumTryArcs = 0; |
| 185 | 194 | ||
diff --git a/CPP/7zip/UI/Console/List.cpp b/CPP/7zip/UI/Console/List.cpp index 3f33dac..874caef 100644 --- a/CPP/7zip/UI/Console/List.cpp +++ b/CPP/7zip/UI/Console/List.cpp | |||
| @@ -1155,7 +1155,7 @@ HRESULT ListArchives( | |||
| 1155 | CArchiveLink arcLink; | 1155 | CArchiveLink arcLink; |
| 1156 | 1156 | ||
| 1157 | COpenCallbackConsole openCallback; | 1157 | COpenCallbackConsole openCallback; |
| 1158 | openCallback.Init(&g_StdOut, g_ErrStream, NULL); | 1158 | openCallback.Init(&g_StdOut, g_ErrStream, NULL, listOptions.DisablePercents); |
| 1159 | 1159 | ||
| 1160 | #ifndef Z7_NO_CRYPTO | 1160 | #ifndef Z7_NO_CRYPTO |
| 1161 | 1161 | ||
diff --git a/CPP/7zip/UI/Console/List.h b/CPP/7zip/UI/Console/List.h index 4969c3e..d87f512 100644 --- a/CPP/7zip/UI/Console/List.h +++ b/CPP/7zip/UI/Console/List.h | |||
| @@ -11,10 +11,12 @@ struct CListOptions | |||
| 11 | { | 11 | { |
| 12 | bool ExcludeDirItems; | 12 | bool ExcludeDirItems; |
| 13 | bool ExcludeFileItems; | 13 | bool ExcludeFileItems; |
| 14 | bool DisablePercents; | ||
| 14 | 15 | ||
| 15 | CListOptions(): | 16 | CListOptions(): |
| 16 | ExcludeDirItems(false), | 17 | ExcludeDirItems(false), |
| 17 | ExcludeFileItems(false) | 18 | ExcludeFileItems(false), |
| 19 | DisablePercents(false) | ||
| 18 | {} | 20 | {} |
| 19 | }; | 21 | }; |
| 20 | 22 | ||
diff --git a/CPP/7zip/UI/Console/Main.cpp b/CPP/7zip/UI/Console/Main.cpp index 854e110..dabd696 100644 --- a/CPP/7zip/UI/Console/Main.cpp +++ b/CPP/7zip/UI/Console/Main.cpp | |||
| @@ -1280,7 +1280,9 @@ int Main2( | |||
| 1280 | { | 1280 | { |
| 1281 | CExtractScanConsole scan; | 1281 | CExtractScanConsole scan; |
| 1282 | 1282 | ||
| 1283 | scan.Init(options.EnableHeaders ? g_StdStream : NULL, g_ErrStream, percentsStream); | 1283 | scan.Init(options.EnableHeaders ? g_StdStream : NULL, |
| 1284 | g_ErrStream, percentsStream, | ||
| 1285 | options.DisablePercents); | ||
| 1284 | scan.SetWindowWidth(consoleWidth); | 1286 | scan.SetWindowWidth(consoleWidth); |
| 1285 | 1287 | ||
| 1286 | if (g_StdStream && options.EnableHeaders) | 1288 | if (g_StdStream && options.EnableHeaders) |
| @@ -1330,7 +1332,7 @@ int Main2( | |||
| 1330 | ecs->Password = options.Password; | 1332 | ecs->Password = options.Password; |
| 1331 | #endif | 1333 | #endif |
| 1332 | 1334 | ||
| 1333 | ecs->Init(g_StdStream, g_ErrStream, percentsStream); | 1335 | ecs->Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents); |
| 1334 | ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1); | 1336 | ecs->MultiArcMode = (ArchivePathsSorted.Size() > 1); |
| 1335 | 1337 | ||
| 1336 | ecs->LogLevel = options.LogLevel; | 1338 | ecs->LogLevel = options.LogLevel; |
| @@ -1494,6 +1496,7 @@ int Main2( | |||
| 1494 | CListOptions lo; | 1496 | CListOptions lo; |
| 1495 | lo.ExcludeDirItems = options.Censor.ExcludeDirItems; | 1497 | lo.ExcludeDirItems = options.Censor.ExcludeDirItems; |
| 1496 | lo.ExcludeFileItems = options.Censor.ExcludeFileItems; | 1498 | lo.ExcludeFileItems = options.Censor.ExcludeFileItems; |
| 1499 | lo.DisablePercents = options.DisablePercents; | ||
| 1497 | 1500 | ||
| 1498 | hresultMain = ListArchives( | 1501 | hresultMain = ListArchives( |
| 1499 | lo, | 1502 | lo, |
| @@ -1538,7 +1541,7 @@ int Main2( | |||
| 1538 | uo.SfxModule = kDefaultSfxModule; | 1541 | uo.SfxModule = kDefaultSfxModule; |
| 1539 | 1542 | ||
| 1540 | COpenCallbackConsole openCallback; | 1543 | COpenCallbackConsole openCallback; |
| 1541 | openCallback.Init(g_StdStream, g_ErrStream, percentsStream); | 1544 | openCallback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents); |
| 1542 | 1545 | ||
| 1543 | #ifndef Z7_NO_CRYPTO | 1546 | #ifndef Z7_NO_CRYPTO |
| 1544 | bool passwordIsDefined = | 1547 | bool passwordIsDefined = |
| @@ -1563,7 +1566,7 @@ int Main2( | |||
| 1563 | callback.StdOutMode = uo.StdOutMode; | 1566 | callback.StdOutMode = uo.StdOutMode; |
| 1564 | callback.Init( | 1567 | callback.Init( |
| 1565 | // NULL, | 1568 | // NULL, |
| 1566 | g_StdStream, g_ErrStream, percentsStream); | 1569 | g_StdStream, g_ErrStream, percentsStream, options.DisablePercents); |
| 1567 | 1570 | ||
| 1568 | CUpdateErrorInfo errorInfo; | 1571 | CUpdateErrorInfo errorInfo; |
| 1569 | 1572 | ||
| @@ -1598,7 +1601,7 @@ int Main2( | |||
| 1598 | if (percentsStream) | 1601 | if (percentsStream) |
| 1599 | callback.SetWindowWidth(consoleWidth); | 1602 | callback.SetWindowWidth(consoleWidth); |
| 1600 | 1603 | ||
| 1601 | callback.Init(g_StdStream, g_ErrStream, percentsStream); | 1604 | callback.Init(g_StdStream, g_ErrStream, percentsStream, options.DisablePercents); |
| 1602 | callback.PrintHeaders = options.EnableHeaders; | 1605 | callback.PrintHeaders = options.EnableHeaders; |
| 1603 | callback.PrintFields = options.ListFields; | 1606 | callback.PrintFields = options.ListFields; |
| 1604 | 1607 | ||
diff --git a/CPP/7zip/UI/Console/OpenCallbackConsole.h b/CPP/7zip/UI/Console/OpenCallbackConsole.h index c5b4b45..5e7c19c 100644 --- a/CPP/7zip/UI/Console/OpenCallbackConsole.h +++ b/CPP/7zip/UI/Console/OpenCallbackConsole.h | |||
| @@ -22,7 +22,7 @@ protected: | |||
| 22 | bool _totalFilesDefined; | 22 | bool _totalFilesDefined; |
| 23 | // bool _totalBytesDefined; | 23 | // bool _totalBytesDefined; |
| 24 | 24 | ||
| 25 | bool NeedPercents() const { return _percent._so != NULL; } | 25 | bool NeedPercents() const { return _percent._so && !_percent.DisablePrint; } |
| 26 | 26 | ||
| 27 | public: | 27 | public: |
| 28 | 28 | ||
| @@ -49,11 +49,16 @@ public: | |||
| 49 | 49 | ||
| 50 | virtual ~COpenCallbackConsole() {} | 50 | virtual ~COpenCallbackConsole() {} |
| 51 | 51 | ||
| 52 | void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream) | 52 | void Init( |
| 53 | CStdOutStream *outStream, | ||
| 54 | CStdOutStream *errorStream, | ||
| 55 | CStdOutStream *percentStream, | ||
| 56 | bool disablePercents) | ||
| 53 | { | 57 | { |
| 54 | _so = outStream; | 58 | _so = outStream; |
| 55 | _se = errorStream; | 59 | _se = errorStream; |
| 56 | _percent._so = percentStream; | 60 | _percent._so = percentStream; |
| 61 | _percent.DisablePrint = disablePercents; | ||
| 57 | } | 62 | } |
| 58 | 63 | ||
| 59 | Z7_IFACE_IMP(IOpenCallbackUI) | 64 | Z7_IFACE_IMP(IOpenCallbackUI) |
diff --git a/CPP/7zip/UI/Console/PercentPrinter.cpp b/CPP/7zip/UI/Console/PercentPrinter.cpp index 1e3cfce..cfdab03 100644 --- a/CPP/7zip/UI/Console/PercentPrinter.cpp +++ b/CPP/7zip/UI/Console/PercentPrinter.cpp | |||
| @@ -88,6 +88,8 @@ void CPercentPrinter::GetPercents() | |||
| 88 | 88 | ||
| 89 | void CPercentPrinter::Print() | 89 | void CPercentPrinter::Print() |
| 90 | { | 90 | { |
| 91 | if (DisablePrint) | ||
| 92 | return; | ||
| 91 | DWORD tick = 0; | 93 | DWORD tick = 0; |
| 92 | if (_tickStep != 0) | 94 | if (_tickStep != 0) |
| 93 | tick = GetTickCount(); | 95 | tick = GetTickCount(); |
diff --git a/CPP/7zip/UI/Console/PercentPrinter.h b/CPP/7zip/UI/Console/PercentPrinter.h index 4debb3b..46988a5 100644 --- a/CPP/7zip/UI/Console/PercentPrinter.h +++ b/CPP/7zip/UI/Console/PercentPrinter.h | |||
| @@ -43,12 +43,14 @@ class CPercentPrinter: public CPercentPrinterState | |||
| 43 | public: | 43 | public: |
| 44 | CStdOutStream *_so; | 44 | CStdOutStream *_so; |
| 45 | 45 | ||
| 46 | bool DisablePrint; | ||
| 46 | bool NeedFlush; | 47 | bool NeedFlush; |
| 47 | unsigned MaxLen; | 48 | unsigned MaxLen; |
| 48 | 49 | ||
| 49 | CPercentPrinter(UInt32 tickStep = 200): | 50 | CPercentPrinter(UInt32 tickStep = 200): |
| 50 | _tickStep(tickStep), | 51 | _tickStep(tickStep), |
| 51 | _prevTick(0), | 52 | _prevTick(0), |
| 53 | DisablePrint(false), | ||
| 52 | NeedFlush(true), | 54 | NeedFlush(true), |
| 53 | MaxLen(80 - 1) | 55 | MaxLen(80 - 1) |
| 54 | {} | 56 | {} |
diff --git a/CPP/7zip/UI/Console/UpdateCallbackConsole.h b/CPP/7zip/UI/Console/UpdateCallbackConsole.h index b6c1be4..276edba 100644 --- a/CPP/7zip/UI/Console/UpdateCallbackConsole.h +++ b/CPP/7zip/UI/Console/UpdateCallbackConsole.h | |||
| @@ -64,13 +64,18 @@ public: | |||
| 64 | 64 | ||
| 65 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } | 65 | void SetWindowWidth(unsigned width) { _percent.MaxLen = width - 1; } |
| 66 | 66 | ||
| 67 | void Init(CStdOutStream *outStream, CStdOutStream *errorStream, CStdOutStream *percentStream) | 67 | void Init( |
| 68 | CStdOutStream *outStream, | ||
| 69 | CStdOutStream *errorStream, | ||
| 70 | CStdOutStream *percentStream, | ||
| 71 | bool disablePercents) | ||
| 68 | { | 72 | { |
| 69 | FailedFiles.Clear(); | 73 | FailedFiles.Clear(); |
| 70 | 74 | ||
| 71 | _so = outStream; | 75 | _so = outStream; |
| 72 | _se = errorStream; | 76 | _se = errorStream; |
| 73 | _percent._so = percentStream; | 77 | _percent._so = percentStream; |
| 78 | _percent.DisablePrint = disablePercents; | ||
| 74 | } | 79 | } |
| 75 | 80 | ||
| 76 | void ClosePercents2() | 81 | void ClosePercents2() |
diff --git a/CPP/7zip/UI/FileManager/BrowseDialog2.cpp b/CPP/7zip/UI/FileManager/BrowseDialog2.cpp index 59f7527..4bb8a34 100644 --- a/CPP/7zip/UI/FileManager/BrowseDialog2.cpp +++ b/CPP/7zip/UI/FileManager/BrowseDialog2.cpp | |||
| @@ -939,7 +939,8 @@ void CBrowseDialog2::OnDelete(/* bool toRecycleBin */) | |||
| 939 | s.Add_LF(); | 939 | s.Add_LF(); |
| 940 | s += s2; | 940 | s += s2; |
| 941 | } | 941 | } |
| 942 | if (::MessageBoxW((HWND)*this, s, LangString(titleID), MB_OKCANCEL | MB_ICONQUESTION) != IDOK) | 942 | if (::MessageBoxW((HWND)*this, s, LangString(titleID), |
| 943 | MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) | ||
| 943 | return; | 944 | return; |
| 944 | } | 945 | } |
| 945 | 946 | ||
diff --git a/CPP/7zip/UI/FileManager/PanelItemOpen.cpp b/CPP/7zip/UI/FileManager/PanelItemOpen.cpp index f4ee3f3..244a962 100644 --- a/CPP/7zip/UI/FileManager/PanelItemOpen.cpp +++ b/CPP/7zip/UI/FileManager/PanelItemOpen.cpp | |||
| @@ -609,7 +609,7 @@ HRESULT CPanel::OpenParentArchiveFolder() | |||
| 609 | if (folderLink.WasChanged(newFileInfo)) | 609 | if (folderLink.WasChanged(newFileInfo)) |
| 610 | { | 610 | { |
| 611 | UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, folderLink.RelPath); | 611 | UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, folderLink.RelPath); |
| 612 | if (::MessageBoxW((HWND)*this, message, L"7-Zip", MB_OKCANCEL | MB_ICONQUESTION) == IDOK) | 612 | if (::MessageBoxW((HWND)*this, message, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES) |
| 613 | { | 613 | { |
| 614 | if (OnOpenItemChanged(folderLink.FileIndex, fs2us(folderLink.FilePath), | 614 | if (OnOpenItemChanged(folderLink.FileIndex, fs2us(folderLink.FilePath), |
| 615 | folderLinkPrev.UsePassword, folderLinkPrev.Password) != S_OK) | 615 | folderLinkPrev.UsePassword, folderLinkPrev.Password) != S_OK) |
| @@ -1249,7 +1249,7 @@ static THREAD_FUNC_DECL MyThreadFunction(void *param) | |||
| 1249 | } | 1249 | } |
| 1250 | { | 1250 | { |
| 1251 | const UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, tpi->RelPath); | 1251 | const UString message = MyFormatNew(IDS_WANT_UPDATE_MODIFIED_FILE, tpi->RelPath); |
| 1252 | if (::MessageBoxW(g_HWND, message, L"7-Zip", MB_OKCANCEL | MB_ICONQUESTION) == IDOK) | 1252 | if (::MessageBoxW(g_HWND, message, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES) |
| 1253 | { | 1253 | { |
| 1254 | // DEBUG_PRINT_NUM("SendMessage", GetCurrentThreadId()); | 1254 | // DEBUG_PRINT_NUM("SendMessage", GetCurrentThreadId()); |
| 1255 | if (SendMessage(tpi->Window, kOpenItemChanged, 0, (LONG_PTR)tpi.get()) != 1) | 1255 | if (SendMessage(tpi->Window, kOpenItemChanged, 0, (LONG_PTR)tpi.get()) != 1) |
diff --git a/CPP/7zip/UI/FileManager/PanelOperations.cpp b/CPP/7zip/UI/FileManager/PanelOperations.cpp index 6c2cea1..af313ff 100644 --- a/CPP/7zip/UI/FileManager/PanelOperations.cpp +++ b/CPP/7zip/UI/FileManager/PanelOperations.cpp | |||
| @@ -244,7 +244,8 @@ Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION | |||
| 244 | messageID = IDS_WANT_TO_DELETE_ITEMS; | 244 | messageID = IDS_WANT_TO_DELETE_ITEMS; |
| 245 | messageParam = NumberToString(indices.Size()); | 245 | messageParam = NumberToString(indices.Size()); |
| 246 | } | 246 | } |
| 247 | if (::MessageBoxW(GetParent(), MyFormatNew(messageID, messageParam), LangString(titleID), MB_OKCANCEL | MB_ICONQUESTION) != IDOK) | 247 | if (::MessageBoxW(GetParent(), MyFormatNew(messageID, messageParam), LangString(titleID), |
| 248 | MB_YESNOCANCEL | MB_ICONQUESTION) != IDYES) | ||
| 248 | return; | 249 | return; |
| 249 | 250 | ||
| 250 | CDisableNotify disableNotify(*this); | 251 | CDisableNotify disableNotify(*this); |
diff --git a/DOC/7zip.wxs b/DOC/7zip.wxs index fe31819..f3fba10 100644 --- a/DOC/7zip.wxs +++ b/DOC/7zip.wxs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | <?xml version="1.0"?> | 1 | <?xml version="1.0"?> |
| 2 | 2 | ||
| 3 | <?define VerMajor = "24" ?> | 3 | <?define VerMajor = "24" ?> |
| 4 | <?define VerMinor = "06" ?> | 4 | <?define VerMinor = "07" ?> |
| 5 | <?define VerBuild = "00" ?> | 5 | <?define VerBuild = "00" ?> |
| 6 | <?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?> | 6 | <?define MmVer = "$(var.VerMajor).$(var.VerMinor)" ?> |
| 7 | <?define MmHex = "$(var.VerMajor)$(var.VerMinor)" ?> | 7 | <?define MmHex = "$(var.VerMajor)$(var.VerMinor)" ?> |
diff --git a/DOC/lzma.txt b/DOC/lzma.txt index 045502f..166bc3b 100644 --- a/DOC/lzma.txt +++ b/DOC/lzma.txt | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | LZMA compression | 1 | LZMA compression |
| 2 | ---------------- | 2 | ---------------- |
| 3 | Version: 24.06 | 3 | Version: 24.07 |
| 4 | 4 | ||
| 5 | This file describes LZMA encoding and decoding functions written in C language. | 5 | This file describes LZMA encoding and decoding functions written in C language. |
| 6 | 6 | ||
diff --git a/DOC/readme.txt b/DOC/readme.txt index affc1d5..6d04c5a 100644 --- a/DOC/readme.txt +++ b/DOC/readme.txt | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | 7-Zip 24.06 Sources | 1 | 7-Zip 24.07 Sources |
| 2 | ------------------- | 2 | ------------------- |
| 3 | 3 | ||
| 4 | 7-Zip is a file archiver for Windows. | 4 | 7-Zip is a file archiver for Windows. |
diff --git a/DOC/src-history.txt b/DOC/src-history.txt index 3637c24..2d0ba98 100644 --- a/DOC/src-history.txt +++ b/DOC/src-history.txt | |||
| @@ -1,6 +1,16 @@ | |||
| 1 | HISTORY of the 7-Zip source code | 1 | HISTORY of the 7-Zip source code |
| 2 | -------------------------------- | 2 | -------------------------------- |
| 3 | 3 | ||
| 4 | 24.07 2024-06-19 | ||
| 5 | ------------------------- | ||
| 6 | - Changes in files: | ||
| 7 | Asm/x86/Sha256Opt.asm | ||
| 8 | Asm/x86/Sha1Opt.asm | ||
| 9 | Now it uses "READONLY" flag for constant array segment. | ||
| 10 | It fixes an issue where ".rodata" section in 7-Zip for x86/x64 Linux had a "WRITE" attribute. | ||
| 11 | - The bug was fixed: 7-Zip could crash for some incorrect ZSTD archives. | ||
| 12 | |||
| 13 | |||
| 4 | 24.06 2024-05-26 | 14 | 24.06 2024-05-26 |
| 5 | ------------------------- | 15 | ------------------------- |
| 6 | - The bug was fixed: 7-Zip could not unpack some ZSTD archives. | 16 | - The bug was fixed: 7-Zip could not unpack some ZSTD archives. |
