This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
libffi and longs
- From: Pupeno <pupeno at pupeno dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Sun, 24 Apr 2005 18:38:31 -0300
- Subject: libffi and longs
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hello,
I've had troubles in the FFI module I'm building when dealing with (unsigned)
longs, what happens is that the second unsigned long argument never reached
the function I'm calling with ffi_call.
I've built a small test (attached) to show this particular problem (in the
hope that the problem would disappear, but that didn't happen). I've checked
and re-checked how I pass the arguments to ffi_call, I couldn't find anything
wrong (debugging libffi internals is not easy :( ).
Any hints are helpful.
Thanks.
- --
Pupeno: pupeno@pupeno.com - http://pupeno.com
Reading Science Fiction ? http://sfreaders.com.ar
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)
iD8DBQFCbBHbfW48a9PWGkURAreSAKCQh4GuO5z1oFG+Li7d6wgd/p8JVACeOxbP
Y3VqhfC6N8HIqiREC+pscMs=
=jltr
-----END PGP SIGNATURE-----
#include <stdio.h>
unsigned long uLongSum(unsigned long a, unsigned long b){
printf("Summing unsigned long %ld to unsigned long %ld. Resulting in %ld.\n", a, b, a + b);
return a + b;
}
signed long sLongSum(signed long a, signed long b){
printf("Summing signed long %ld to signed long %ld. Resulting in %ld.\n", a, b, a + b);
return a + b;
}
CC=gcc
all: libffitarget.so testffi
ffitarget.o: ffitarget.c
$(CC) -fPIC -Wall -g -ggdb -c ffitarget.c
libffitarget.so: ffitarget.o
gcc -g -ggdb -shared -Wl,-soname,libffitarget.so.0 -o libffitarget.so ffitarget.o -lc
testffi: testffi.c
gcc testffi.c -o testffi -ldl -lffi -g -ggdb
clean:
-rm libffitarget.so ffitarget.o testffi
#include <stdio.h>
#include <ffi.h>
#include <dlfcn.h>
int main(){
unsigned long a = 150;
unsigned long b = 345;
unsigned long rc;
void *libHandle;
void *funcHandle;
void *values[2];
ffi_type *args[2];
ffi_cif cif;
/* Initialize the argument info vectors */
args[0] = &ffi_type_ulong;
args[1] = &ffi_type_ulong;
values[0] = &a;
values[1] = &b;
libHandle = dlopen("./libffitarget.so", RTLD_LAZY);
funcHandle = dlsym(libHandle, "uLongSum");
/* Initialize the cif */
if(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_uint, args) == FFI_OK){
ffi_call(&cif, funcHandle, &rc, values);
printf("It returned %ld.\n", rc);
}
return 0;
}