Non ho intenzione di usare comandi esterni, quindi non mi puo' tornare utile nè il comando file, nè la funzione popen().
Per risolvere il terzo punto devo leggere questo magic number, che tra l'altro nemmeno conoscevo

Ho fatto una prova al volo ed il tipo di file che cerco sembra avere sempre il primo byte uguale a 0x457F, non so se sia il magic number o meno, ma sta di fatto che tutti i binari che usano librerie condivise iniziano con quel valore.
Esempio:
- Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char** argv)
{
FILE* fd;
#define size 255
int i;
unsigned short magic;
char buffer[size + 1] = { 0 };
if (argc < 2) return EXIT_FAILURE;
for (i = 1; i <= argc; i++)
{
if (!(fd = fopen (argv[i], "rb"))) return EXIT_FAILURE;
fread ((unsigned short*)&magic, sizeof (unsigned short), 1, fd);
// printf ("Magic of %s: 0x%X\n", argv[i], magic);
if (magic != 0x457F)
{
memset (buffer, 0, size);
snprintf (buffer, size, "ldd %s", argv[i]);
system (buffer);
}
fclose (fd);
}
return EXIT_SUCCESS;
}
Sui files che hanno il primo byte diverso da 0x457F lancio ldd, ed infatti da shell:
- Codice: Seleziona tutto
bt ~ # for i in $(ls /usr/bin); do ./a.out /usr/bin/$i; done
not a dynamic executable
not a dynamic executable
not a dynamic executable
not a dynamic executable
not a dynamic executable
not a dynamic executable
not a dynamic executable
[...]
Prima di passare all'ultimo punto, ovvero alla lettura delle librerie linkate dinamicamente, mi serve una conferma.
Quello che leggo è il magic number ? E' univoco ?
[edit] Piccola precisazione: il codice di sopra va a leggere piu' di un byte, se leggo un solo byte ottengo 0xBF7F.