Scrivere una libreria esterna che modifica un byte all'interno dell'area di memoria di una variabile

Da Gambas-it.org - Wikipedia.

Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.

Nella funzione esterna verrà utilizzata una "Union", contenente due soli membri: il primo un array di tipo char di 4 elementi (corrispondente in Gambas al tipo Byte), il secondo membro di tipo int (corrispondente in Gambas al tipo Integer).

Poiché nella Union i membri hanno identico indirizzo di memoria (corrispondente fra l'altro a quello della Union di appartenenza), il membro array char[4] viene a corrispondere nei suoi elementi ai 4 byte di memoria occupata dal secondo membro di tipo int.

Così, dunque, modificando uno o più elementi dell'array char[4], si modificheranno i corrispondenti byte dell'area di memoria del membro di tipo int.

Library "/tmp/lib"

' int modmem (int v, char x, char n)
' Modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.
Private Extern modmem(v As Integer, x As Byte, n As Byte) As Integer


Public Sub Main()
 
 Dim origo, i As Integer
 Dim index, sost As Byte
  
  CreaSo()
  
  origo = &01020304
  index = 2
  sost = &88
  
  i = modmem(origo, index, sost)
  
  Print Hex(i, 8), i
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/lib.c", "union unione {\n"
           "   char c[4];\n" &
           "   int i;\n};\n\n"
           "union unione un;\n\n\n"
           "int modmem (int v, char x, char n) {\n\n" &
           "   un.i = v;\n\n" &
           "   un.c[x] = n;\n" &
           "   return un.i;\n\n}")
   
 Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
End