zpaqfranz 65.20: improvements everywhere
No big new feature this time (just a small one: -thunderbird).
65.20 is a release of many improvements, spread all over the program: the
result of a bug hunt.
In short:
- A full disk no longer ruins an archive (bugfix, with data loss): the
version written half way stayed in the archive, and every backup after it
was lost. Now the archive is put back as it was. - The archive is never added to itself (when it is inside the folder you back up).
- An empty name is never the root of the disk:
d "" -force(an empty
variable in a script) could delete the duplicates of the whole disk. - Exit codes that tell the truth: a dozen cases said 0 ("all OK") on a damaged
archive, a wrong path, a backup that could not be read, nothing done at all. - No more crashes on the arguments tried (
swith no folder,-until -1,-ramsize 0...). - No more waiting for a key that cannot come:
ls,pause,tui,guiin
a script, with no console. xcwith big blocks (issue 357): a restored disk could come out short,
without a word, when the RAM was not enough.- Dates after 2038 (Linux, BSD, macOS):
xrestored them wrong. - Long paths on Windows: no more silent skips, and
-longpathstores relative names. testbackupsays OK only if the backup can really be read.- New:
-thunderbird: the mail of every user, from one PC to another. - For packagers:
-DBUILD_FEDORA(no cryptography),-DNOAES,-DNOUPDATE;
-DNOFRANZENbuilds again. The Makefile knows them (make BUILD_FEDORA=yes),
and no longer gets wrong the byte order (ppc64le, s390x, sparc) or the target of a
cross compilation. Every-Dwas built with every other: four did not go, now they do.
Part one, what is new, for the user
- A full disk during
a - The archive is never added to itself
- An empty name is not the root of the disk
- Exit codes that tell the truth
- Crashes
- No console, no waiting
xcand big blocks (issue 357)- Dates after 2038
- Long paths on Windows
testbackup, as strict ast-thunderbird- Builds for packagers (Fedora)
1. A full disk during a
Bugfix, with data loss. When the disk filled up during a, zpaqfranz said so
(01295 Something STRANGE happened... Media full?) and gave exit code 2. Right.
But the version written half way stayed in the archive: data without the
tables that describe them. From then on:
tandisaid DAMAGED, for ever (andtrimsaid "not necessary");- the next
a, with the space back, wrote a new version thatxcould not
extract (0 files).
In short: after the first full disk, every following backup into that archive
was lost. A kill -9 in the middle of a does not do this (the next run
overwrites the interrupted one, as zpaq always did: tried 20 times, the archive
always good).
Now. zpaq only appends: the bytes written before the run are untouched. If
the writes of a do not all go, the archive is cut back to the size it had
before the run, or removed if the run created it:
66858! <<z:/backup.zpaq>> put back as it was before this run (...bytes): nothing of this run is stored, the next run goes on from there
Exit code 2, as before; but the archive is the one of yesterday, good, and the
next backup works. If it cannot be put back, 66859 says so (then crop it).
This is done only where it is sure: a plain or -key archive, or a new part of a
multipart one. With -chunk, -index and Franzen the archive is not touched,
and 66860 says to check it with t.
2. The archive is never added to itself
zpaqfranz a z:\nas\docs.zpaq z:\nas\
The archive is inside the folder being archived. The second run stored the
archive of the first one, inside itself; and so did every run after it.
Now the archive being written, its .franzen, its -index file and the parts of
a multipart archive (x_???.zpaq) are never added. A line says so:
66862: <<z:/nas/docs.zpaq>> is the archive being written: not added to itself
3. An empty name is not the root of the disk
"" + / is /: the root. A script with an empty variable:
zpaqfranz d "$FOLDER" -force (FOLDER empty)
was d / -force: the duplicates of the whole disk, deleted (read in the
code; not tried, for obvious reasons). sum "" read the whole disk.
Now an empty argument, as a file or as a folder, is refused by every command,
with exit code 2:
66841! An empty argument ("", an empty variable?) is not a file nor a folder: nothing done
The one exception is the archive to write: zpaqfranz a "" *.cpp
compresses without writing anything (to see how much it would take), as
always. And -to with no value (as in zpaq 7.15).
In the same family:
a x.zpaqwith nothing to add (ora ""): it printed the help, exit code 0.
A backup script with an empty variable "succeeded" doing nothing. Now 66840,
exit code 2.i ""(an empty table) andpakka "": exit code 2 (66842, 66843).
4. Exit codes that tell the truth
The rule is the one of t: 0 only if everything is really OK, 1 a warning
(something you can recover from), 2 an error. Several cases did not follow it:
| Command | Before | Now |
|---|---|---|
i, ls, v, crop (without -kill), fzf, tui, gui on a damaged archive
| 72415! DAMAGED ARCHIVE, then "all OK", 0
| 1, as l
|
sync x.zpaq c:\wrong\path
| "No delta (this is VERY GOOD)", 0 | 66838, 2 |
sync where nothing is compared on either side
| "all OK", 0 | 66839, 2 |
a x.zpaq with nothing to add
| the help, 0 | 66840, 2 |
fzf on an archive that does not exist
| nothing printed, 255 | 66850 (on stderr), 2 |
testbackup, a backup that t and x cannot read
| OK, 0 | 2 (point 10) |
a on Windows, paths over 260 characters, without -longpath
| a yellow line, 0 | 66861 for each folder, 1 |
a -m5 with a compression job killed by lack of RAM
| 1 (nothing in the archive) | 2 |
versum on a folder (instead of the file of hashes)
| *nix 1, Windows 2 | 66864, 2 everywhere |
xc (and the restore of image) with fragments that did not come out
| a short file, no word | 03876, 2 (point 7) |
a ... -thunderbird with no Thunderbird folder
| "quit!" (01850)... and then the whole c:\users\x archived
| 2 |
A script that checks the exit code can now trust it in these cases too.
5. Crashes
On the arguments tried (several thousand command lines, see
part three), zpaqfranz no longer crashes. Fixed:
swith no folder: segmentation fault.-until -1(count back from the last version) on an archive that does not
exist, and a wrong date in-until: an unhandled exception, abort, core dump.
Now 66846 and 66845, exit code 2.-ramsize 0(or-1, or with no value;-ramtoo): a division by zero in
x(FreeBSD: "Floating point exception"). Now refused, 66844.-until 99999999999999999999: an overflow, a version at random. Now
refused, 66847.- A damaged block header asking for an absurd amount of RAM (2^77 bytes): an
undefined conversion, which dirtied the count of the RAM. Now capped. hash: some fields were not initialized (undefined behaviour: work it did
not need, for each file).- MD5 and SHA-3 read their input as 32 or 64 bit words even when it was not
aligned. On x86, nothing. On real ARM hardware it can be a crash (SIGBUS) or,
on ARMv5, a wrong hash with no word. Under emulation the hashes were right, so
I cannot say it ever happened on a NAS; anyway, now the data is copied first.
6. No console, no waiting
With the input that is not a console (a script, ssh, a pipe, a scheduled task):
ls(Windows) waited for a command at its prompt for ever. Now it reads
the commands from the input, and ends with it, as on Linux.tuiandgui(Windows): the same. Now they end.pausewaited for a key that could never come. Now it is skipped (a line
says so) and exit code 0.pause -n 10still waits 10 seconds.
From a console, everything is as before.
7. xc and big blocks (issue 357)
xc of an ac -m86h20 backup (64 MB blocks) restored a disk image of 49 GB that
was 247,720 bytes short, while tw said all OK. A good backup, a bad restore.
The cause: for xc (and for the restore of image), the cache of the
decompressed blocks could take all the free RAM. With 64 MB blocks the
threads that decompress found no memory left (bad_alloc), the block came out
empty, and its fragments were skipped without a word.
Now:
- a thread with no memory halves the cache and tries again, up to 4 times
(09190, yellow: what comes out is good); - if it really cannot: 09189 and 03877, which says that this is not a
damaged archive (try-ramsize 4GBor-t2); - the fragments that did not come out are counted, never skipped: 03876, exit
code 2. Never a short file with no word; - the automatic cache is the free RAM, less four of the biggest blocks for each
thread, less 1 GB; never below a quarter of the free RAM.
On a 4 GB virtual machine, xc of a 5 GB disk (a 2 GB -m86h1 backup): all OK,
in about 12 minutes. For an older zpaqfranz: xc ... -ramsize 8GB.
8. Dates after 2038
x on Linux, the BSDs and macOS restored a file dated after 2038-01-19 with a
wrong date: 2040-06-01 became 1904-04-26, 2100 became 1964. The days were
multiplied by 86,400 in a 32-bit integer (code from zpaq 7.15). Now 64 bit.
9. Long paths on Windows
- Without
-longpath, a file whose path is over 260 characters was skipped
with a yellow line, and exit code 0: a script believed every file saved. Now
each folder is listed (66861) and the exit code is 1. - With
-longpath, the archive stored absolute paths (W:/work/...) even
for a folder given as relative (lunghi). Thent x.zpaq lunghi -longpath
compared relative with absolute: every file "missing", exit code 2 on a good
archive;x -to output the files underout/W/work/.... Now:- relative stays relative, as without
-longpath; t ... -longpathscans the folder in the extended form (\\?\);x -longpathwithout-towrites in the extended form (the long files
failed before).
- relative stays relative, as without
10. testbackup, as strict as t
testbackup said OK on a backup set that t and x cannot read:
- a part on the disk that is not in the list of the backup (a backup interrupted
after writing the part, before the list):tsaid "cannot read_archive...
THIS IS VERY BAD",xERROR; - the index (
_backup.index) missing:l,t,xsaid "Archive not found".
Now, as t, it says OK only if everything is right, always (not only with
-paranoid): 66853 the index is missing, 66854 the index cannot be read whole,
66855 a part not in the list. Exit code 2.
An encrypted index is read only if its password is given (-key, -franzen);
without it, only its presence is checked (66857). And the message 02781 showed,
as "expected", the MD5 of the list instead of the hash it was compared with.
11. -thunderbird
Windows (not in the open build, as before). The mail of Thunderbird, from a
PC to another one, with nothing to set up again.
zpaqfranz a z:\mail.zpaq -thunderbird the user running zpaqfranz
zpaqfranz a z:\mail.zpaq c:\users\franco -thunderbird the user of that profile folder (as before)
zpaqfranz a z:\mail.zpaq -thunderbird -all every user of the PC (an elevated administrator)
-kill close Thunderbird first (open, its files change while they are read)
-frugal leave out what Thunderbird makes again (caches, crash reports, locks, *.tmp)
zpaqfranz x z:\mail.zpaq -thunderbird back to the users with the same name
zpaqfranz x z:\mail.zpaq -thunderbird -to caio into another user (one user in the archive)
The typical use: on the old PC a -thunderbird; on the new one, a clean install
of Thunderbird, then x -thunderbird.
a takes AppData\Roaming\Thunderbird (the profiles, the mail) and
AppData\Local\Thunderbird, and the profiles of profiles.ini with an
absolute path (anywhere: without them, the backup is not the whole mail).
-all: the users come from the registry (the real accounts), compared with
the folders ofC:\Users(a yellow line if they differ).- A user whose mail cannot be read is skipped and said (66886), with a summary
at the end (66876) and exit code 1. -frugalleaves out only the entries of one table, and only at the top of
the Thunderbird folders and of the profiles: a mail folder calledcrashes
orx.tmpis mail, and stays.- Thunderbird open, without
-kill: a yellow line (66891).
x -thunderbird never destroys what is there:
- the users are taken from the paths in the archive;
- each one goes to the user with the same name on this PC (or to
-to);
a user that is not on this PC is skipped and said, exit code 1; - what is there (the folders of the clean install) is renamed
Thunderbird.001(the first number free) and checked. If one rename fails,
the ones done are put back, nothing is extracted, exit code 2; - the mail is extracted;
- into another user: the paths of the old one, in
prefs.jsand
profiles.ini, are corrected (a.bakis kept).
An archive with errors is not restored (66898: t to see them).
The mail of the other users. With the permissions Windows gives by default,
the Administrators group can read C:\Users\x:
- an elevated administrator reads the mail of the others:
-allworks; - a non-elevated administrator, or a standard user, cannot: those users are
skipped, and said; - a user who denied access to the administrators: closed, elevated or not.
zpaqfranz never takes the ownership of a file and never changes a permission.
The old -thunderbird (which took the folder of one user) had some bugs:
- with no Thunderbird folder it said "quit!" and then archived the folder given:
the wholec:\users\x; - it wanted both
LocalandRoaming: withRoamingonly, the mail was not
taken; - the profiles with an absolute path were left out;
-killwrote a.batin the temporary folder (a user name with an accent:
it failed), did not wait for Thunderbird to close and did not check;- with
-longpaththe long paths ofImapMailwere skipped; - the paths were stored in lowercase.
12. Builds for packagers (Fedora)
zpaqfranz is packaged by Fedora. For that package (and for whoever wants the
same) there is now a build with no cryptography of its own in the binary:
-DBUILD_FEDORA, the sum of four switches, each one usable alone.
| Switch | What it removes |
|---|---|
-DNOAES
| AES and scrypt: -key, -key2, -keyfile, FRANZKEY, password, checkpassword
|
-DNOFRANZEN
| Franzen: no franzsodium, no libsodium (it did not build in 65.19: fixed, PR 358) |
-DNOEMAIL
| Mbed TLS: no work email
|
-DNOUPDATE
| update, and so the RSA that checks my signature (a package manager updates it)
|
-DBUILD_FEDORA
| all four, and SFTP too, even with -DSFTP: no libcurl, no libssh
|
What stays, on purpose: the hashes (SHA-1 is the zpaq format; the others check
the integrity of the files, they do not encrypt anything) and the random numbers
of the system. The archives in clear are the same as in any other build. Its
banner says FEDORA, its usage "Archiver w/dedup, no encryption".
What is left out says so, and stops (exit code 2): an encrypted archive (03870),
-key (03871), update (03875). It never asks for a password a script would
wait for.
Careful: a BUILD_FEDORA zpaqfranz cannot read an archive encrypted with
-key. Read it with any other build.
The Makefile (build 1.8)
The Fedora package does not use my Makefile: "It does not recognize s390x, strips
executables". They were right, and it was worse than that:
- The byte order was guessed from the name of the machine (
uname -m):
ppc64le and mipsel got-DBIG, but they are little endian; s390x and sparc did
not, and they are big endian.-DBIGdecides the byte order of SHA-1 (the
deduplication), SHA-2, SHA-3, xxHash, CRC-32C: wrong means wrong hashes. Now the
compiler says it (__BYTE_ORDER__). CROSS_COMPILEtook the flags of the machine that compiles, not of the
target: an aarch64 build got the SHA instructions of x86 (-DHWSHA2), and with
clang++ installed it looked for anaarch64-linux-gnu-clang++that almost never
exists. Now the target is the one of the compiler (-dumpmachine), and the cross
compiler is g++.-DANCIENTonly for the old big endian PowerPC (Macs G3, G4, G5), no longer for
ppc64le (POWER8 and later).
New options:
make BUILD_FEDORA=yes no AES, Franzen, e-mail, update, SFTP
make ENABLE_AES=no or one at a time: ENABLE_FRANZEN=no ENABLE_EMAIL=no ENABLE_UPDATE=no
make ENABLE_IPV6=yes do not force IPv4
make install ENABLE_STRIP=no ENABLE_DIRLINK=no PREFIX=/usr DESTDIR=...
for a package: the symbols stay (debuginfo), and no "dir"
link (on Linux /usr/bin/dir belongs to coreutils)
make check shows the target, the byte order and every option.
Every -D with every other
A switch that nobody compiles rots (-DNOFRANZEN did not build in 65.19). So the
-D switches were built together: not all the 2^n combinations, but enough builds
that every three of them are together in at least one (a covering array). On
Windows (the full source, the open one, 32 bit and XP), FreeBSD (clang) and Linux
(gcc, with the profiles ANCIENT, NAS, ESX too). Four did not go, all fixed:
-DALIGNMALLOCcrashed at once on every 64 bit system: an alignment of 4
bytes, smaller than a pointer, and every allocation was refused. It is the one
the Makefile gives to sparc, which today is sparc64. Now 8.-DIPV6did not build on Windows (it is for the http client of *nix: Windows
ignores it now).-DOPENdid not build on Windows without-DNOFRANZEN(libsodium stayed in,
and called a piece of the full build).-DANCIENT -DZPAQMOUNTwithout Mbed TLS (-DNOEMAIL,BUILD_FEDORA) did not
build on FreeBSD (signal.h).
The comment at the top of the source now lists every -D, the five above
included; -DSERVER and -DGUI, which no longer did anything, are gone.
Also: the Twofish implementation (for a client-server version never released) is
no longer in the source, and gcc 16 in C++20 builds it with no warnings (++ on
a volatile).
Part two, the details, for power users
1. What can change for a script
- Exit codes: the table of point 4.
Where a script got 0, it can now get 1 or 2. ""as a file or a folder: refused, exit code 2, for every command
(66841). The archive to write can still be"".a x.zpaqalone: exit code 2.-ramsize 0,-ram 0, negative, or with no value: exit code 2 (66844).-untilwith more than 19 digits: exit code 2 (66847).pausewith no console: it does not wait (pause -n Xdoes).ls,tui,guion Windows with a pipe or a file as input: they read it,
and end with it.aon a full disk: the archive is put back as it was (exit code 2, as
before).ainto a folder that contains the archive: the archive is not added.testbackup: exit code 2 if the index is missing or damaged, or if a part
is not in the list.a -thunderbird: with no folder, the user running zpaqfranz (before: help
and nothing done); with-all, every user; a user skipped = exit code 1.- The Makefile on ppc64le and mipsel: no more
-DBIG(and on ppc64le no
more-DANCIENT): another binary, the right one. On s390x and sparc:-DBIG.
make installstrips and makes thedirlink as before, unless
ENABLE_STRIP=no/ENABLE_DIRLINK=no. -DALIGNMALLOC: the banner says.8(was.4).
2. The switches
| Switch | What |
|---|---|
a -thunderbird
| (Windows) the mail of the user running zpaqfranz, or of the profile folders given |
a -thunderbird -all
| every user of the PC (an elevated administrator); no folders |
a -thunderbird -kill
| close Thunderbird first (of every user) |
a -thunderbird -frugal
| leave out caches, crash reports, locks, *.tmp (and no smaller franz blocks: that is -frugal without -thunderbird)
|
x -thunderbird
| the mail back; what is there becomes Thunderbird.001, never overwritten
|
x -thunderbird -to user
| into this user of the PC (one user in the archive); prefs.js and profiles.ini corrected, .bak
|
3. The messages
| Code | When |
|---|---|
01295
| (as before) the writes of a did not all go: a full disk?
|
03870-03875
| a build without AES (NOAES) or update (NOUPDATE): not in this build, nothing done
|
03876!
| xc, x -stdout: fragments that did not come out (exit code 2)
|
03877!
| blocks given up for lack of memory: NOT a damaged archive |
03878$
| a block found no memory, and was decompressed again: what came out is good |
09189!, 09190$
| a block with no memory: given up, or tried again with a smaller cache |
66836!, 66837!
| d "", sum "" (behind 66841)
|
66838!, 66839!
| sync: the folder does not exist; nothing compared
|
66840!
| a with nothing to add
|
66841!
| an empty argument as a file or a folder |
66842!, 66843!
| i "", pakka ""
|
66844!
| -ramsize, -ram: 0, negative or no value
|
66845!, 66846!, 66847!
| -until: a wrong date; counting back on an archive that cannot be read; too many digits
|
66850!, 66851!
| fzf: archive not found; -comment with no text
|
66852
| pause with no console: skipped
|
66853!-66855!, 66857
| testbackup: the index missing, damaged; a part not in the list; an encrypted index, password not given
|
66858!-66860!
| a on a full disk: put back as it was; could not; not put back (-chunk, -index, Franzen)
|
66861$
| Windows, a path too long without -longpath: skipped
|
66862
| the archive being written: not added to itself |
66863
| t ... -longpath: the folder scanned in the extended form
|
66864!
| versum on a folder
|
66873-66892
| a -thunderbird
|
66893-66905
| x -thunderbird
|
Part three, for developers
1. How it was tested
On virtual machines (Windows 11, Fedora, FreeBSD, the Debian that builds the NAS
binaries), with builds that watch every access to memory: gcc and clang with
AddressSanitizer + UndefinedBehaviorSanitizer + assertions, MinGW with
assertions on Windows.
- Degenerate arguments. Every command with: nothing,
"", a path that does
not exist, a text file, a folder, an empty archive, a text file called
.zpaq, an archive cut in half, a good archive, a good archive and a path that
does not exist: 660 command lines on Linux and FreeBSD, 336 on Windows (plus
the "dangerous" commands by hand). Then every switch that takes a value, with
no value,"",0,-1, 20 digits, a path that does not exist: about 2,100
command lines on Linux and FreeBSD, 972 on Windows. Then paths up to 411
characters and names in Japanese, Greek, emoji. - ARM. The NAS binaries (ARMv5, ARMv7 Cortex-A9, AArch64 Cortex-A53), under
qemu, 660 command lines each. - Hostile archives. 44,047 damaged copies of 10 kinds of archive (Franzen
too), one in ten tried witht tw pp p x, then with 10 more commands. An
archive of 4,347 bytes cut at every offset, and each byte XOR FF and zeroed:
12,640 copies, each one withl t x i. - Resources. ThreadSanitizer on 18 commands: no race on the data (only on
counters for the statistics and the bars, estimates on purpose). Little RAM
(ulimit -vfrom 64 to 512 MB), a full disk (a RAM disk of 64 and 128 MB), 20
kill -9duringa: after each one the archive was good, and the nextaworked. - Against 65.19, on the same command lines: 65.19 had 5 crashes, 3 hangs, 5
"error printed, exit code 0"; 65.20 has none (the only "hang" left isb, the
benchmark, which is long on purpose). Every verdict that changed went towards
OK; every exit code that changed is one of the fixes above. No regression. - Against zpaq 7.15: 7.15 lists and extracts archives of 65.20 made with
-m0to-m9,-key,-nochecksum, byte for byte; 65.20 reads the archives
of 7.15. 154 checks. - Regressions. The batteries of the earlier releases (278 checks on Windows,
232 on Fedora, 225 on FreeBSD, and 17 torture batteries);autotest -allwith
the sanitizers: nothing. - Builds. Every
-Dwith every other, as a covering array (every three
switches together in at least one build): on Windows 26 builds of the full
source, 9 of the open one, 7 at 32 bit and for XP; on FreeBSD (clang) 24 and 9;
on Linux (gcc) 38 syntax checks, withANCIENT,NAS,ESX. Every one that
runs here:autotest,a/e/cmp,-keyand-franzenrefused or not as
they should,updatewithNOUPDATE, the banner. After the four fixes: no KO.
-DALIGNMALLOC:autotest -allon FreeBSD and Linux. - The Makefile, for real, on Oracle Linux 7.9 (make 3.82, gcc 4.8.5), Arch,
openSUSE, macOS (make 3.81, Apple clang), Solaris 11, OpenBSD, Alpine (musl),
Fedora and FreeBSD: the default build,BUILD_FEDORAwith the mount,install
for a package and as always,static, a cross compilation. - Then the release binaries on every system (see the end).
2. Left as they are, on purpose
I decided to keep these as they are:
- An unknown switch (a typo, or a switch with no value) is ignored, with
00562! Unknown option ignored, and the command goes on: exit code 0.
Careful with-excldueinstead of-exclude. - A wrong
-datefrom/-dateto(a year out of 1970-2070, an odd length):
the filter is dropped, with a message, and the command works on everything. mount x.vhdx -testof a disk restored byxc: the partitions that were
not in the backup are there, empty (RAW), and Windows gives them a letter that
cannot be read: exit code 2.pakkaon a damaged archive: exit code 0. It is for the GUI: it lists
every version of every file, in sequence.password ... -key2 .(an encrypted archive made plain):tof the new
archive gives a WARNING (03739, the-lfasthistory is 32 bytes off: the salt
is gone). The data are all there (llists them all). A remote case.
3. Known limits
-thunderbirdwas tested on Windows 11 with six users (accents, a space,ü,
one who denied access to the administrators) and profiles with the structure
of real ones, made by a script: 94 checks. Not with Thunderbird itself
installed on that machine. No Win Server etc.- The restore of an
-imagearchive (notxc): a block that really cannot be
decompressed (a damaged archive, not the lack of memory) is still skipped with
no word. - A few damaged archives (bytes changed inside the post-processor of
-m1or
-m2) can maketandxloop. lshows 2100-05-31 for a file of 2100-06-01 (the leap year rule of zpaq: from
2100 on).- The counters of the RAM and of the bars are not atomic: with many threads they
are an estimate. -DALIGNMALLOCwas tried on x86-64 only: I have no sparc. Or, better, I do have a PPC Mac but too lazy to reconnect. With gcc-O3it
gives 15 warnings-Wfree-nonheap-object, all on the same branch of
aligned_malloc(), one that cannot run.make staticneeds the static C library of the system (on openSUSE
glibc-devel-static, not installed by default).
4. The binaries
Built from the same source and tried on each system (autotest, then quick
checks of repack, w, tw, -tar and, where there is a handler, Ctrl+C in
the middle of a):
| System | Binary |
|---|---|
| NAS (musl, static) | zpaqfranz_armv5, _armv7, _armv7_cortexa9, _armv7_cortexa15, _armv8, _cortexa53, _cortexa55, _cortexa57, _cortexa72, _nas_i686, _nas_x86_64
|
| ESXi | zpaqfranz_esx
|
| Solaris 11 | zpaqfranz_solaris
|
| macOS (Intel and Apple Silicon) | zpaqfranz_macos
|
| openSUSE | zpaqfranz_opensuse
|
| Oracle Linux 7.9 | zpaqfranz_oracle79
|
| OpenBSD 7.9 | zpaqfranz_openbsd
|
| Arch | zpaqfranz_arch
|
| FreeBSD | zpaqfranz_freebsd
|
| Fedora | zpaqfranz_fedora
|
Alpine (musl) too, as a check only: no binary. The warnings of the compilers
are the known ones (most of them in code by others: Mbed TLS, libzpaq), none
new. As always, the pairs A53 = A55 and A57 = A72 are the same file: gcc makes
the same code for them (see NAS.md).