diff options
Diffstat (limited to 'src/backend/port/beos/support.c')
-rw-r--r-- | src/backend/port/beos/support.c | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c index bc5264e5490..936c151e864 100644 --- a/src/backend/port/beos/support.c +++ b/src/backend/port/beos/support.c @@ -115,6 +115,22 @@ beos_dl_open(char *filename) } } +void +beos_dl_sym(image_id im,char* symname,void** fptr) +{ + /* Send command '3' (get symbol) to the support server */ + write_port(beos_dl_port_in, 3, symname, strlen(symname) + 1); + write_port(beos_dl_port_in, im, NULL,0); + + /* Read sym address */ + read_port(beos_dl_port_out, (int32*)(fptr), NULL, 0); + + if (fptr==NULL) + { + elog(NOTICE, "loading symbol '%s' failed ", symname); + } +} + status_t beos_dl_close(image_id im) { @@ -164,12 +180,13 @@ beos_startup(int argc, char **argv) * server */ read_port(port_in, &opcode, datas, 4000); - + switch (opcode) { image_id addon; image_info info_im; area_info info_ar; + void * fpt; /* Load Add-On */ case 1: @@ -208,6 +225,33 @@ beos_startup(int argc, char **argv) write_port(port_out, unload_add_on(*((int *) (datas))), NULL, 0); break; /* Cleanup and exit */ + case 3: + + /* read image Id on the input port */ + read_port(port_in, &addon,NULL,0); + + /* Loading symbol */ + fpt=NULL; + + + if (get_image_symbol(addon, datas, B_SYMBOL_TYPE_TEXT, &fpt) == B_OK); + { + + /* + * Sometime the loader return B_OK for an inexistant function + * with an invalid address !!! Check that the return address + * is in the image range + */ + + get_image_info(addon, &info_im); + if ((fpt < info_im.text) ||(fpt >= (info_im.text +info_im.text_size))) + fpt=NULL; + } + + /* Send back fptr of data segment */ + write_port(port_out, (int32)(fpt),NULL,0); + break; + default: /* Free system resources */ delete_port(port_in); |