https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing
Le problème
Depuis la dernière mise à jour ipkg, l'utilitaire "file" ne marche que partiellement sur mon Synology DS 207+. Symptômes:file /path/to/something
renvoie la bonne information de fichier mais est suivie d'un segfault:
/path/to/something: RAR archive data, v1d, os: Win32
Segmentation fault (core dumped)
En soi, l'utilitaire reste utilisable en ligne de commande, mais il ne peut plus être appelé dans un script, car dès qu'on essaie de sauver le stdout, le segfault prend le pas et rien n'est sauvé. file /path/to/something | grep . ne renvoie rien, myvar=$(file -b /path/to/something) est vide.
La solution
Il faut recompiler file, en version 5.12. Pour cela, installer le toolchain, comme expliqué dans l'article sur rsyncrypto. Puis, télécharger le code de file-5.12, ici: ftp://ftp.astron.com/pub/file/file-5.12.tar.gz . L'extraire, et modifier le fichier src/apprentice.c ainsi:--- apprentice.c.old 2014-05-06 09:57:34.154444863 +0200
+++ apprentice.c 2014-05-06 09:59:03.834446304 +0200
@@ -348,11 +348,9 @@
protected void
file_ms_free(struct magic_set *ms)
{
- size_t i;
if (ms == NULL)
return;
- for (i = 0; i < MAGIC_SETS; i++)
- mlist_free(ms->mlist[i]);
+ mlist_free(ms->mlist[0]);
free(ms->o.pbuf);
free(ms->o.buf);
free(ms->c.li);
Recompiler (comme pour rsyncrypto) avec:
./configure --host=arm-marvell-linux-gnu --target=arm-marvell-linux-gnu --build=i686-pc-linux --prefix=/opt/
CC=arm-marvell-linux-gnu-gcc ARCH=arm make
(en cas de problème de compilation, il vous faudra peut être installer file5.12 sur votre machine compilante et/ou transférer votre fichier synology /opt/share/misc/magic.mgc vers votre répertoire source de compilation)
Puis transférer le fichier résultat: src/.libs/libmagic.so.1.0.0 (qui sera ainsi non-strippé par ailleurs, de même que le binaire file situé au même endroit mais qu'il n'est pas nécessaire de transférer, lui) vers le Synology, dans /opt/lib/
Lien vers le fichier libmagic.so.1.0.0 recompilé pour DS-207+:
https://drive.google.com/file/d/0B9w1DBAb0xtWSDBhdWFadjZyQTg/edit?usp=sharing
Pour info, mais non-nécessaire, le lien vers le binaire file recompilé, non-strippé:
https://drive.google.com/file/d/0B9w1DBAb0xtWdVFyT0d2TmNFVHM/edit?usp=sharing
(NB: le core dump se fait dans /volume1/@file.core , pour tout autre système, vous pouvez savoir où se trouve votre coredump en faisant:
cat /proc/sys/kernel/]core_pattern
Pour plus d'info: Read /usr/src/linux/Documentation/sysctl/kernel.txt.
[/proc/sys/kernel/]core_pattern is used to specify a core dumpfile pattern name.Pour debugger cela, vous auriez eu besoin de gdb sur le syno, puis de faire du gdb à coup de :
If the first character of the pattern is a '|', the kernel will treat the rest of the pattern as a command to run. The core dump will be written to the standard input of that program instead of to a file.
file /path/to/something
gdb file /volume1/@file.core
avec des versions de file et libmagic.so.1.0.0 recompilées pour ne pas être strippées.
Puis les commandes gdb classiques: "bt", ...
)
