Outils systèmes pour aider au développement
Comment obtenir les fonctions d'une librairie statique ? Taper le one-liner ci-dessous et hop !
nm -gop --demangle --defined-only <static lib.a> | grep ' T '
Source : comps.os.linux.development.apps
Comment obtenir les fonctions d'une librairie statique ? Taper le one-liner ci-dessous et hop !
nm -gop --demangle --defined-only <static lib.a> | grep ' T '
Petite page temporaire de prise de notes pour un futur point complet sur l'analyse et la réduction des exécutables.
#include <stdio.h>
#include <string.h>
int pgcd(int u, int v, int verbose)
{
int M = 1;
while (u && v) {
if (verbose) printf("pgcd(%d, %d)\n", u, v);
if (!(u&1) && !(v&1)) { M <<= 1; u>>=1, v>>=1; }
else if (!(u&1) && v&1) u>>=1;
else if (u&1 && !(v&1)) v>>=1;
else {
//Les deux nombres sont impairs
if (u>v) u=(u-v)>>1;
else v=(v-u)>>1;
}
}
return M * (u ? u : v);
}
int printSyntax(char* progName, int retVal)
{
printf("Syntaxe pour calculer le PGCD de u et v :\n\n\t%s [--verbose] <u> <v>\n\n", progName);
return retVal;
}
int main(int argc, char** argv)
{
int Verbose;
int N[2], i, j;
for(i=1, j=0; i<argc && j<2; i++) {
if (!strcmp(argv[i], "--verbose")) Verbose = 1;
if (!strcmp(argv[i], "--help")) return printSyntax(*argv, 0);
if (!sscanf(argv[i], "%d", &N[j++])) j--;
}
if (argc<=2 || j<2) {
printf("J'ai besoin de deux pour calculer leur PGCD.\n");
return printSyntax(argv[0], 1);
}
//
printf("%d\n", pgcd(N[0], N[1], Verbose));
return 0;
}
Si on compile le source ci-dessus avec les commandes suivantes on arrive à un exécutable de 2764 octets (sur ma machine) :
gcc -Os -Wall -L`gcc -print-file-name=` /usr/lib/crt1.o /usr/lib/crti.o -nostdlib -o pgcd pgcd.c /usr/lib/crtn.o -lc strip --strip-unneeded -R .comment -R .gnu.version -R .note.ABI-tag pgcd
Questions :