ich hatte 44806 im Verdacht
Bei dem steht "This bug manifests on i686, and not on x86_64." Bei mir tritt der Fehler beim x86_64 auf.
Gerade das gefällt mir an Deiner Lösung nicht...
Mir gefällt der Patch auch nicht. Und Lösung würde ich ihn erst recht nicht nennen, außer, daß ein funktionsfähiges Programm herauskommt.
Wenn man die Optimierung ausschaltet, würde man das konsequenterweise für alle Programme tun, die auf dem Host erstellt werden.
Dein Patch an sich sorgt bei mir auch nur für noch mehr Verwirrung, denn ich verstehe ihn nicht bzw. wieso er das Problem löst
Von der Funktionsweise ist der Patch einfach:
Es gibt ein vorhandenes Makro SQUASHFS_SWAP_LREG_INODE_HEADER, das auf eine Unmenge von Anweisungen expandiert wird. Es wird eine Funktion definiert, die genau dieses Makro aufruft. Das Makro wird danach so umdefiniert, daß es diese Funktion aufruft. Funktional ist der Code identisch, aber bei der Optimierung von create_inode macht es einen Unterschied.
Zuerst hatte ich vor, diese Umdefinition für alle Fälle zu machen, aber nachdem es schon mit diesem einen ging, hatte ich nicht weiter gemacht.
Wenn es Dich beruhigt, ich weiß auch nicht, warum es mit diesem Patch funktioniert. Wie bereits oben geschrieben, funktioniert das Programm nicht, wenn man den Aufruf von SQUASHFS_SWAP_LREG_INODE_HEADER komplett entfernt. Es hilft auch nicht, den kompletten LREG-Zweig zu entfernen.
Man könnte ausprobieren, welche Zweige bei unseren konkreten Firmwares tatsächlich gebraucht werden und ob es funktioniert, wenn man alle anderen entfernt.
bei mir wird der SQUASHFS_LREG_TYPE-Zweig gar nicht durchlaufen, auch wenn ich mit Absicht mehrere Symlinks auf eine und dieselbe Datei anlege.
Ich hatte bereits geschrieben, daß der Zweig bei uns höchstwahrscheinlich gar nicht genutzt wird. Ein Symlink ist etwas anderes als ein (Hard-)Link. Den kannst Du mit "ln" ohne die Option "-s" anlegen. Ich bin zuversichtlich, daß das Programm damit auch korrekt läuft, aber wie Du selbst festgestellt hast, ist dieser Fall für unsere Firmwares nicht von Bedeutung.
Wieso sollte das Miscompilen eines Code-Stücks, welches gar nicht durchlaufen wird, von irgendeiner Bedeutung sein? Es ist aus meiner Sicht so, dass Deine Code-Änderung lediglich dafür sorgt, dass irgendeine Optimierung nicht mehr angewandt werden kann und zwar nicht auf den LREG-, sondern auf irgendein anderen (benachbarten?) Teil.
Zunächst ist es ein Problem des Compilers, und der Compiler kann nicht wissen, welche Teile des Programms später tatsächlich ausgeführt werden und welche nicht. Es könnte ja sein, daß Dateien mit mehreren Links oder mehr als 1GB vorkommen, wobei der Compiler auch nicht wissen kann, welche externen Bedingungen dafür sorgen würden, daß dieser Teil des Codes ausgeführt wird.
Der Compiler versucht nicht nur, einzelne Code-Zweige zu optimieren, sondern die Funktion als ganze. Irgendwo kommt er dabei durcheinander. Vielleicht, weil diese SWAP-Macros einiges an gemeinsamem Code enthalten, das des Compiler als identisch erkennt, und dies nach der Änderung nicht mehr der Fall ist.
Mit anderen Worten, ich würde das Problem etwas mehr verstehen wollen, bevor ich entscheide, ob ich mit dem Fix leben kann.
Wie schon geschrieben, gefällt mir der Fix auch nicht. Ich würde ihn eher hier im Thread stehen lassen für diejenigen,die diesen Compiler nutzen, als ihn mit aufzunehmen.
Dein Patch behebt das Problem für mich nicht.
Welcher Patch? Der Patch von mir ändert mksquashfs3-lzma, nicht unsquashfs3-lzma