Για τον μηχανισμό του LD_PRELOAD

Ο μηχανισμός $LD_PRELOAD μας επιτρέπει να αλλάξουμε την συμπεριφορά ενός προγράμματος απέξω αλλάζοντας τον κώδικά των βιβλιοθηκών που χρησιμοποιεί.

Ας δούμε πως μπορούμε να αλλάξουμε την συμπεριφορά του παρακάτω απλού προγράμματος, που απλά τυπώνει λίγους τυχαίους αριθμούς

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
  srand(time(0));
  for(int i=0; i !=10 ; ++i) {
     printf("%d\n", rand());
  }
  return 0;
}

Ας το κάνουμε εκτελέσιμο και ας το δοκιμάσουμε

  gcc -o test text.c

Η ποιότητα των τυχαίων αυτών αριθμών δεν είναι η καλύτερη δυνατή, αλλά ας δούμε πως μπορούμε να το κάνουμε λίγο ποιο ενδιαφέρον. Ας φτιάξουμε κάποιους καλύτερους τυχαίους αριθμούς

int rand(){
    return 42; //the most random number in the universe
}

και ας το κάνουμε μια βιβλιοθήκη

gcc -shared -fPIC unrandom.c -o unrandom.so

θα τρέξουμε τώρα το αρχικό πρόγραμμα ώς εξής και η ποιότητα θα βελτιωθεί [πηγή]

  LD_PRELOAD=./unrandom.so ./test

Ο μηχανισμός αυτός είναι χρήσιμος για πολλές περιπτώσεις. Για παράδειγμα αν ενα πρόγραμμα δεν γνωρίζει για το pulseaudio θα το τρέξουμε με την βοήθεια του προγράμματος padsp. Αυτό θα χρησιμοποιήσει τον μηχανισμό LD_PRELOAD.

Μια καλύτερη χρήση του μηχανισμού είναι να ακυρώσεις την γραμμή srand(time(0)); και να παίρνεις πάντα τους ίδιους τυχαίους αριθμούς κάθε φορά που τρέχει το πρόγραμμα, χρήσιμο όταν κάνεις ανάπτυξη και θέλεις μια συνεπή συμπεριφορά.

Ένα άλλο κόλπο είναι να τρέχεις ένα συγκεκριμένο πρόγραμμα με άλλη ημερομηνία απο αυτή του συστήματος

Ένα άλλο κόλπο είναι να αλλάξεις την ταχύτητα κίνησης του χρόνου για αυτήν την #%!@ πίστα σε αυτό το παιγνίδι

Μπορείτε να βρείτε πολλά άλλα τέτοια χρήσιμα στο παρακάτω αποθετήριο

Ελπίζω να έκανα λίγο κατανοητό τον μηχανισμό του $LD_PRELOAD και να μπορείς να καταλάβεις το τι περίπου κάνει αν τον συντατήσεις σε οδηγίες στο internet

3 Likes

Το 42 είναι η απάντηση στην ερώτηση. Αν θέλουμε πραγματικά τυχαίο αριθμό

int rand()
{
    return 4 //Εγγυημένα τυχαία ρίψη πραγματικού ζαριού
}

:wink:

2 Likes