[Glass] FFI and C subsystems

bruno buzzi brassesco smalltalk at adinet.com.uy
Thu Nov 26 11:00:32 PST 2020


Martin,

Thank you for the clarification !

regards,
bruno

On 26/11/2020 15:56, Martin McClure wrote:
> Hi Bruno,
>
> AFAIK, if two different wrapper classes load the same shared library, 
> that shared library will only be loaded once, and both wrappers will 
> be using the same handle for the library. A CPointer obtained through 
> one wrapper class should be portable to be used through the other 
> wrapper class.
>
> Regards,
> -Martin
>
> On 11/26/20 10:01 AM, bruno buzzi brassesco wrote:
>>
>> Martin/James,
>>
>> Thank for your answers.
>>
>> We are implementing a SSH Server (with SFTP also). The sftp.h header 
>> implement all related stuff to SFTP but if you load:
>> CHeader path: '/usr/include/libssh/sftp.h'.
>>
>> Then you have the SFTP stuff but not the server capabilities. And if 
>> you load server.h header:
>> CHeader path: '/usr/include/libssh/server.h'.
>>
>> Then you have the Server stuff but not the SFTP.
>>
>> And there is almost no documentation for the server part.
>> (the SSH and SFTP client are working ok)
>>
>> So i did this kind of workaround to have both in the same GS wrapper.
>>
>> I did this because i was not sure if i can combine calls of two 
>> different wrapper in GS.
>>
>> For example if i generate a sshSession (aCPointer) from 
>> LibsshServerWrapper (server.h) then Can i use it (aCPointer) as 
>> argument to call a function in LibsshSftpWrapper?
>>
>> regards,
>> bruno
>>
>> On 26/11/2020 14:42, Martin McClure wrote:
>>> Hi Bruno, James,
>>>
>>> libssh.so is one of the libraries that defines many functions, and 
>>> the prototypes for those functions are spread over multiple header 
>>> files.
>>>
>>> When I personally deal with such libraries in GemStone I tend to 
>>> make one class per header file, since that seems a bit cleaner to 
>>> me. The documentation for each function says which header to 
>>> include, and that tells me which one of my classes to use.
>>>
>>> However, this is a matter of taste. Certainly it should work to 
>>> include libssh.h and sftp.h into the same class, since the functions 
>>> defined in both are for the same shared library. I don't know about 
>>> server.h -- in my system the only headers with that name are 
>>> unrelated to libssh.so.
>>>
>>> Regards,
>>> -Martin
>>>
>>> On 11/26/20 9:13 AM, James Foster via Glass wrote:
>>>> Bruno,
>>>>
>>>> Header files describe what is in a library. The “libssh.h” header 
>>>> describes what is in the “libssh” library and the “sftp.h” header 
>>>> describes what is in the “sftp” library. While you can create a new 
>>>> header file that (wrongly) claims that function A is in library B, 
>>>> that doesn’t mean that when we go to look for A in B that it will 
>>>> be found.
>>>>
>>>> Just because I put down Casa Rosada as your address on my contact 
>>>> list doesn’t make it so. I might mail a letter, but you won’t get 
>>>> it. Just because you pretend that a function is in a library 
>>>> (making up a new header) doesn’t make it so. You may be able to 
>>>> create the Smalltalk wrapper, but when you call it the function 
>>>> won’t be found because it isn’t in the library.
>>>>
>>>> The header file is simply a text file that describes what is in a 
>>>> binary file. Changing the text file doesn’t change the binary file.
>>>>
>>>> James
>>>>
>>>>
>>>>> On Nov 26, 2020, at 9:01 AM, bruno buzzi brassesco 
>>>>> <smalltalk at adinet.com.uy <mailto:smalltalk at adinet.com.uy>> wrote:
>>>>>
>>>>> James,
>>>>>
>>>>> The new header files does not have any function declaration only 
>>>>> "#includes" sentences.
>>>>>
>>>>> Actually the entire new header files is:
>>>>> #include "libssh.h"
>>>>> #include "server.h"
>>>>> #include "sftp.h"
>>>>>
>>>>> So i do not see how a lookup will fail. But again maybe I'm 
>>>>> missing something :)
>>>>>
>>>>> regards,
>>>>> bruno
>>>>>
>>>>> On 26/11/2020 13:21, Smalltalk at JGFoster.net wrote:
>>>>>> Bruno,
>>>>>>
>>>>>> If it works, then it may be fine, but I’ll be somewhat surprised 
>>>>>> if that happens. My vague idea of the way a program interacts 
>>>>>> with a shared library is as follows: (1) you ask the OS to load a 
>>>>>> library (such as '/usr/lib64/libssh.so.4.4.0’ and the OS give you 
>>>>>> back a ‘handle’ to that library; (2) you ask the OS to look up a 
>>>>>> function in the library (you pass a string with the function name 
>>>>>> and you pass in the previously returned handle) and the OS give 
>>>>>> you back a pointer to a function in that library; (3) you use the 
>>>>>> pointer to call the function. These are the steps that GemStone 
>>>>>> handles; you will have previously created an object that 
>>>>>> encapsulates the function name, parameter types, and return types.
>>>>>>
>>>>>> If you use the wrong header to generate a list of expected entry 
>>>>>> points in a library, then the Smalltalk code will still be 
>>>>>> generated and you can still load the library (step 1), but when 
>>>>>> you attempt to lookup a function from library A in library B, the 
>>>>>> OS will fail at step 2 since the function does not exist. I think 
>>>>>> that if you want to call functions in two libraries, then you 
>>>>>> need to load both libraries (step 1) and do the name lookup in 
>>>>>> the proper library (step 2).
>>>>>>
>>>>>> But my expertise in this area is several years old and was on the 
>>>>>> Smalltalk side not on the VM side.
>>>>>>
>>>>>> James
>>>>>>
>>>>>>> On Nov 26, 2020, at 4:42 AM, bruno buzzi brassesco via Glass 
>>>>>>> <glass at lists.gemtalksystems.com 
>>>>>>> <mailto:glass at lists.gemtalksystems.com>> wrote:
>>>>>>>
>>>>>>> James,
>>>>>>>
>>>>>>> It seems that is possible to create a new header file and 
>>>>>>> includes 2 subsystems in the same GS Library.
>>>>>>>
>>>>>>> For example sftp_server_all.h:
>>>>>>> #include "libssh.h"
>>>>>>> #include "server.h"
>>>>>>> #include "sftp.h"
>>>>>>>
>>>>>>> Then:
>>>>>>> | header wrapperClass wrapper |
>>>>>>> header := CHeader path: 'sftp_server_all.h'.
>>>>>>> wrapperClass := header wrapperForLibraryAt:
>>>>>>> '/usr/lib64/libssh.so.4.4.0'.
>>>>>>> wrapperClass initializeFunctions.
>>>>>>> UserGlobals at: wrapperClass name put: wrapperClass.
>>>>>>>
>>>>>>> Do you see any problem with this approach ?
>>>>>>>
>>>>>>> The new library generated all functions now i going to check if 
>>>>>>> they work.
>>>>>>> It should work i think ... (but again not a C expert -dealing 
>>>>>>> with C again after 15 years-)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> regards,
>>>>>>> Bruno
>>>>>>>
>>>>>>> On 9/10/2020 14:53, James Foster via Glass wrote:
>>>>>>>> Bruno,
>>>>>>>>
>>>>>>>> My understanding is that the header parser follows all the 
>>>>>>>> #include directives, so will find everything that could be 
>>>>>>>> called from C code, including abs() in libc. But the process of 
>>>>>>>> calling a dynamic library at runtime involves doing a name 
>>>>>>>> lookup of entry points *for that library,* not for anything 
>>>>>>>> visible *to* the library, so libssh does not have an abs() 
>>>>>>>> entry point. For that you would need a reference to libc.
>>>>>>>>
>>>>>>>> The wrapper generator does not know what is actually in the 
>>>>>>>> given library, just what functions are defined by all included 
>>>>>>>> header files. So you have to do some selection on your own. One 
>>>>>>>> wrapper API has a filter as an argument, and so for a library 
>>>>>>>> like GemStone C Interface where all the functions begin with 
>>>>>>>> ‘gci’ we can filter to only generate wrappers for those 
>>>>>>>> functions (it is unlikely that libc has gci*() functions!).
>>>>>>>>
>>>>>>>> So, yes, you need to have a different library object for each 
>>>>>>>> library so the system can do name lookups properly.
>>>>>>>>
>>>>>>>> James
>>>>>>>>
>>>>>>>>> On Oct 9, 2020, at 5:40 AM, Bruno Buzzi Brassesco via Glass 
>>>>>>>>> <glass at lists.gemtalksystems.com 
>>>>>>>>> <mailto:glass at lists.gemtalksystems.com>> wrote:
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>> Maybe i'm wrong in some concepts here (not a C expert) but ...
>>>>>>>>>
>>>>>>>>> If a C library (libssh) has a subsystem (sftp) in order to 
>>>>>>>>> create a GS wrapper i can do:
>>>>>>>>>
>>>>>>>>>     | header wrapperClass wrapper |
>>>>>>>>>     header := CHeader path: '/usr/include/libssh/sftp.h'.
>>>>>>>>>     wrapperClass := header wrapperForLibraryAt:
>>>>>>>>>     '/usr/lib64/libssh.so.4.4.0'.
>>>>>>>>>     wrapperClass initializeFunctions.
>>>>>>>>>     UserGlobals at: wrapperClass name put: wrapperClass.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> In this case I got all the functions of Libssh and also SFTP, 
>>>>>>>>> so far so good.
>>>>>>>>>
>>>>>>>>> But what happens when there is more than one C subsystem?
>>>>>>>>>
>>>>>>>>> How can I generate only one GS wrapper for the original C 
>>>>>>>>> library (libssh) and all its subsystems ?
>>>>>>>>> Or I will have to create one wrapper per subsystem ?
>>>>>>>>>
>>>>>>>>> regards,
>>>>>>>>> bruno
>>>>>>>>> _______________________________________________
>>>>>>>>> Glass mailing list
>>>>>>>>> Glass at lists.gemtalksystems.com 
>>>>>>>>> <mailto:Glass at lists.gemtalksystems.com>
>>>>>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Glass mailing list
>>>>>>>> Glass at lists.gemtalksystems.com
>>>>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>>>> _______________________________________________
>>>>>>> Glass mailing list
>>>>>>> Glass at lists.gemtalksystems.com 
>>>>>>> <mailto:Glass at lists.gemtalksystems.com>
>>>>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Glass mailing list
>>>> Glass at lists.gemtalksystems.com
>>>> https://lists.gemtalksystems.com/mailman/listinfo/glass
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gemtalksystems.com/mailman/private/glass/attachments/20201126/fee98185/attachment-0001.htm>


More information about the Glass mailing list