Author Topic: 4ko sous Linux  (Read 13684 times)

0 Members and 1 Guest are viewing this topic.

Offline kernel_error

  • Base
    • Pouet.net
    • View Profile
    • wtflol
  • Rôle: code
Re : 4ko sous Linux
« Reply #15 on: 05 July 2011 à 02:46:13 »
  • J'ai essayé le linker Bold de Alrj, il fait vraiment de tout petits exécutables, mais (sur ma machine en tout cas) ils font un segfault ;(

Si t'es sous Archlinux (x86 ou x64) c'est normal, c'est fait exprès, ils aiment transgresser les compatibilités des standards tel que l'ABI/TIS. Bref j'irai pas troller sur cet OS, promis :D.
Bon, il existe un gros trick (de pete) qui permet de resoudre les symboles dynamiquement mais pas avec dlopen/dlsym, ça marche un peu de la même manière mais en plus tricky.
En gros, tu écris tout l'en-tête de ton executable elf en asm, tu as un tableau de hash correspondant à chacun de tes symboles (avec une routine de hash sur 10 instructions), ensuite,
une fois l'elf lancé, tu dois recuperer l'adresse de la première lib en mémoire, tu fouines cette lib, tu hash chaque symbole de la lib et tu compares avec un de tes hash et ainsi de suite pour chaque symbole.
Ça marche plutot bien niveau taille, perso j'ai une fenetre SDL avec un contexte GL, un petit fragment shader et j'en arrive à 930 bytes une fois compressé avec lzma et encore, là j'ai du ajouté
quelques modifs au trick (une GROSSE routine de ~50 instructions) pour que ça tourne sur Archlinux.
Normalement il me semble que Bold (j'ai pas regarder le source code, c'est du python /o\) a repris le concept mais seulement sous x64 (pour je ne sais plus quelle raison, la simplicité de la table
des symboles un truc du genre), je suis moi aussi dans l'optique de dev un linker qui reprend le principe quand j'aurai un peu plus de temps :x

PS: http://pouet.net/topic.php?which=5392&page=1 pour suivre tout l'histoire, en tout cas ce trick (aussi utilisé chez les vxers/et autres méchants pirates) est absolument genial.
« Last Edit: 05 July 2011 à 02:58:10 by kernel_error »

Offline ulrick

  • Base
    • Pouet.net
    • Slengpung
    • View Profile
    • FRequency
  • Ancienneté: 1989
  • Groupe: FRequency
  • Rôle: musique
Re : 4ko sous Linux
« Reply #16 on: 05 July 2011 à 12:22:00 »
Hahaha mais bien sûr :D

Bon moi par contre je suis un peu deg : j'ai viré tous les chargements dynamiques, j'ai compilé en linkant de manière "traditionnelle"... Et là, oh stupeur. Mon exe final (compression comprise) est plus petit d'une centaine d'octets... GRUMPF, ça valait le coup que je me prenne la tête :/

Bravo flure ;). Keep it up!

Offline Saorel

  • Base
    • Coup de coeur
    • View Profile
  • Ancienneté: 2010
  • Rôle: Kodeur
  • Ville: Nice
Re : 4ko sous Linux
« Reply #17 on: 21 July 2011 à 12:36:57 »
Bonjour,

Je découvre la programmation ou l'on se soucie de la taille de l'exécutable, et j'aimerais avoir quelque renseignement, jusqu'à l'intervention de kernel_error, j'avais compris ce qu'il fallait faire, et mes tests étaient concluant. Mais ce post vend du rêves pour moi, moins d'1kb pour un shader et une fenetre! Quelqu'un pourrait-il m'expliquer ? (euh je suis sous Arch x64 - pas taper)

J'avais commencé un effet pour la DemoJS, mais finalement je penses le passer en 4kb étant donné qu'il s'agit d'une scène entièrement réalisé au sein d'un fragment shader, aussi ce tips m'aiderait beaucoup! Mon objectif est de releaser cette prod' fin août.

Je vous remercie de votre aide précieuse!
" We are mutants. If we don’t deeply understand, if we don’t integrate that we are mutants, we completely miss the story " - One of the biggest designer of the World.

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : 4ko sous Linux
« Reply #18 on: 21 July 2011 à 21:20:11 »
Saorel, voici mes techniques. Je ne peux pas utiliser Bold parce que ça fait des segfault, et pourtant je ne suis pas sous archlinux mais ubuntu !
Le premier problème c'est que sous Ubuntu, OSS n'est plus installé par défaut, donc je passe par SDL_audio pour la musique. C'est dommage, j'aurais gagné pas mal de place. J'utilise l'eeeeeexcellent 4klang pour la musique. Enfin, "mon" musicien utilise 4klang dans modplug tracker, ça génère un fichier .o pour linux (ou .obj pour windows) et je n'ai qu'à lier avec et copicoller le tuto pour faire passer ça dans SDL_audio. C'est très simple.
Ensuite, comme toi, je fais tout dans un shader. Pour gagner de la place, minimise le shader en utilisant shader minifier de notre ami LLB. C'est du dotnet et chez moi ça ne marche pas avec mono, alors LLB a eu l'extrême bonté d'en faire une version en ligne.
Pour les options de compile, utilise -O1 ça compressera mieux que -Os ;)
Et aussi, je compile en 32 bits, parce que ça prend moins de place, par contre du coup il faut avoir les libs de compatibilité.
Et pour la liaison, je fais ça normalement avec SDL SDL_audio et GL. J'avais fait des tests avec dlopen/dlsym en pensant que je gagnerais de la place, mais en fait non. Il me reste encore à tester le trick de kernel_error, mais pour l'instant je me concentre sur ce que je mets dans mon shader ;)
Ensuite, utilise sstrip des Elf-kickers pour supprimer tous les symboles inutiles de l'exécutable.
Finalement, tu le compresses avec lzma et tu le colles à un petit script d'auto-extraction-exécution.

Bon, c'est très loin d'être aussi efficace que crinkler sous Windows, mais au moins on aura le mérite de faire de la 4k sous Linux !

Offline kernel_error

  • Base
    • Pouet.net
    • View Profile
    • wtflol
  • Rôle: code
Re : 4ko sous Linux
« Reply #19 on: 24 July 2011 à 14:08:20 »
@flure: dis moi ce que ça te donne:
Code: [Select]
readelf -a /usr/lib/libSDL-1.2.so.0 | grep HASH

Histoire de savoir si la communauté d'Ubuntu est aussi pourri que celle d'Archlinux.

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : 4ko sous Linux
« Reply #20 on: 24 July 2011 à 14:13:45 »
Code: [Select]
florent@florent-desktop:~$ readelf -a /usr/lib/libSDL-1.2.so.0 | grep HASH
  [ 2] .gnu.hash         GNU_HASH         00000000000001f0  000001f0
 0x000000006ffffef5 (GNU_HASH)           0x1f0

En effet ça a pas l'air terrible...

Offline kernel_error

  • Base
    • Pouet.net
    • View Profile
    • wtflol
  • Rôle: code
Re : 4ko sous Linux
« Reply #21 on: 24 July 2011 à 21:19:15 »
Et c'est le drame... c'est normal que ça segfault, il manque l'ancienne section hash.
Pour la petite histoire, binutils ont dev une nouvelle (datant de 2006) section gnu_hash qu'est beaucoup plus rapide que l'ancienne section hash (c'est utilisé pour la résolution de symbole),
néanmoins cette section gnu_hash n'est pas standardisée, c'est pourquoi on peut compiler avec les deux sections, sachant que la section gnu_hash reste prioritaire!
La seul raison, qui poussent ces connards de mainteneurs à compiler seulement avec la section gnu_hash, est de gagner quelques octets sans même se rendre compte
des conséquences que cela peut engendrer.

PS: Sous ubuntu server, l'ancienne section hash y est bien présente, de même que sous n'importe quelle branch de Debian (et slackware, et d'autres distrib sérieuses).

J'ai ""porté"" la 1k flow2 pour les OS de merdes, essaye voir si ça marche: http://kernel-error.tuxfamily.org/public/Demoscene/flow2-fixed.tar.gz

alrj

  • Guest
Re : 4ko sous Linux
« Reply #22 on: 29 July 2011 à 19:08:42 »
Les détails gores:
D'après la spec ELF, l'entrée DT_HASH de la table DYNAMIC est obligatoire, voir par exemple http://www.skyfree.org/linux/references/ELF_Format.pdf page 43.

GNU n'aurait pas dû offrir une option --hash-style=gnu, et les distributions ne devraient pas l'utiliser. Les bibliothèques résultantes ne sont plus conformes au format ELF.

De mon point de vue, c'est un bug qui doit être remonté vers votre distrib, pas vers Bold  ::)

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : 4ko sous Linux
« Reply #23 on: 30 July 2011 à 15:10:22 »
Intéressant.
Je ferai bien un rapport de bug, mais le temps que ça soie corrigé, la Buenzli sera passée ;)
En attendant, je vais faire sans, tant pis...

Offline alrj

  • Base
    • View Profile
    • Ouais... beuh
  • Rôle: flemme
Re : 4ko sous Linux
« Reply #24 on: 30 July 2011 à 20:55:42 »
Et voilà, vous m'avez eu... La version git de Bold supporte (normalement) .gnu.hash  ;D
Il y a sans doute moyen d'optimiser un peu en repensant l'algo ou en utilisant d'autres registres. Ce sera pour plus tard.
(hint: git clone http://git.alrj.org/git/bold.git)
Les plus pressés peuvent simplement utiliser le fichier bold_ibh-x86_64.o joint, à mettre dans /usr/lib/bold/ à la place de l'ancien.

Par contre, j'ai dû contourner un bug très étrange, décrit dans le commentaire du code suivant:
Code: [Select]
        cmp [rdx], dword 4                ; DT_HASH == 4
        jne .no_hash                      ; Why the heck does it segfault when
          mov ecx, [rsi+4]                ; I use cmove ecx, [rsi+4] instead
        .no_hash:                         ; of this jne construction ????

Pour d'autres entrées de la table DYNAMIC, j'utilise les "cmove" sans problème. Quelqu'un aurait une idée ?

Offline alrj

  • Base
    • View Profile
    • Ouais... beuh
  • Rôle: flemme
Re : 4ko sous Linux
« Reply #25 on: 30 July 2011 à 22:24:18 »
Ne cherchez plus pour mon problème de cmove, on a trouvé. L'instruction ira toujours lire [rsi+4], sauf que ça pointe n'importe où quand [rdx] ne vaut pas 4 comme attendu.
Le mov est conditionnel, mais la lecture de la source est inconditionnelle.

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : 4ko sous Linux
« Reply #26 on: 31 July 2011 à 02:55:13 »
Alrj, je t'aime :D

Je teste ça demain (parce que là faut pas déconner il est quand même un peu tard)

Offline alrj

  • Base
    • View Profile
    • Ouais... beuh
  • Rôle: flemme
Re : 4ko sous Linux
« Reply #27 on: 31 July 2011 à 12:34:07 »
Tiens-moi au courant du résultat :)
Et si d'autres personnes sous Arch pouvaient également tester, ça m'arrangerait bien.

Offline flure

  • Base
    • Pouet.net
    • View Profile
  • Ancienneté: 1998
  • Groupe: PoPsY TeAm
  • Rôle: Codeur Linux
  • Ville: Lyon
Re : 4ko sous Linux
« Reply #28 on: 31 July 2011 à 14:11:35 »
Chose promise, chose dûe : ça marche  !!!
Et ça me fait gagner environ 500 octets.
Maintenant il me reste à trouver comment utiliser 4klang en 64 bits...

Offline alrj

  • Base
    • View Profile
    • Ouais... beuh
  • Rôle: flemme
Re : 4ko sous Linux
« Reply #29 on: 31 July 2011 à 14:56:19 »
Bonne nouvelle pour moi, mais j'ai peur que ce soit perdu pour toi si 4klang ne fournit pas une version 64bit.