[squeak-dev] Has anyone gotten FFI working on squeak on a Mac lately?
LawsonEnglish
LEnglish5 at cox.net
Thu Aug 20 20:06:11 UTC 2020
It’s the simplest library I could think of:
.h file:
#ifndef FFITest_h
#define FFITest_h
#define PI 3.14159
double GetPi(void);
#endif /* FFITest_h */
.c file:
#include "FFITest.h"
double GetPi(void){return PI;};
.
By the way, I managed to get things working just fine in my own build of the Mac 64-bit vm, but some new odd behavior as shown up.
I’ll explain in a yet another thread.
L
> On Aug 20, 2020, at 12:31 AM, Tobias Pape <Das.Linux at gmx.de> wrote:
>
>
>> On 20.08.2020, at 09:19, LawsonEnglish <LEnglish5 at cox.net> wrote:
>>
>> If you look at the FFIPrim bundle, it looks different.
>>
>> I still can’t get anything to work except those bundles that are included with the all-in-one.
>>
>>
>> L
>>
>> This is with Cataina.
>>
>> L
>
> Can you share the source of your test library?
>
> best regards
> -tobias
>
>>
>>> On Aug 19, 2020, at 12:31 AM, Tobias Pape <Das.Linux at gmx.de> wrote:
>>>
>>> Hi
>>>
>>>> On 16.08.2020, at 09:36, LawsonEnglish <LEnglish5 at cox.net> wrote:
>>>>
>>>> Running otool -L on my dylib:
>>>>
>>>> otool -L otool -L libFFITest.dylib
>>>> libFFITest.dylib:
>>>> /libFFITest.dylib (compatibility version 1.0.0, current version 1.0.0)
>>>> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
>>>>
>>>> however, running it on the executable int eh SqueakFFIPrims.bundle:
>>>>
>>>> otool -L SqueakFFIPrims
>>>> SqueakFFIPrims:
>>>> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)
>>>>
>>>>
>>>> I’m not sure what the difference means. I can sorta remove /libFFITest.dylib but the "(compatibility version 1.0.0, current version 1.0.0)” remains, and I still get the same error whether or not /libFFITest.dylib is present.
>>>>
>>>>
>>>
>>> there's a stark difference, sadly.
>>> The Plugins, which are bundles on macOS, are _not_ simply dynamic libs:
>>>
>>>
>>> [Squeak.app/Contents/Resources]$ otool -L CameraPlugin.bundle/Contents/MacOS/CameraPlugin
>>> CameraPlugin.bundle/Contents/MacOS/CameraPlugin:
>>> /System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
>>> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1450.15.0)
>>> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics (compatibility version 64.0.0, current version 1129.5.0)
>>> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1450.15.0)
>>> /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
>>> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo (compatibility version 1.2.0, current version 1.5.0)
>>> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
>>> /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
>>>
>>> [Squeak.app/Contents/Resources]$ file CameraPlugin.bundle/Contents/MacOS/CameraPlugin
>>> CameraPlugin.bundle/Contents/MacOS/CameraPlugin: Mach-O 64-bit bundle x86_64
>>>
>>> Dynamic libs look differently:
>>>
>>> [~]$ otool -L /usr/lib/libbz2.dylib
>>> /usr/lib/libbz2.dylib:
>>> /usr/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
>>> /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
>>>
>>> [~]$ file /usr/lib/libbz2.dylib
>>> /usr/lib/libbz2.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [i386:Mach-O dynamically linked shared library i386]
>>> /usr/lib/libbz2.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64
>>> /usr/lib/libbz2.dylib (for architecture i386): Mach-O dynamically linked shared library i386
>>>
>>> =-=-=
>>>
>>> I would suggest you first try to call a known function in a known library. For example:
>>>
>>> const char* BZ2_bzlibVersion(void); from libbzip2.
>>>
>>>
>>> =-=-=
>>>
>>> Other than that, I can't help without some artifact to look at, sorry :/
>>>
>>> Best regards
>>> -Tobias
>>>
>>>
>>>
>>>>
>>>> Can you give me a hint as to what the output from otool -L should look like for a dylib that is useable from within /Resources?
>>>>
>>>> L
>>>>
>>>>
>>>>> On Aug 14, 2020, at 9:19 PM, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>>>>>
>>>>> Hi Lawson,
>>>>>
>>>>>> On Aug 14, 2020, at 6:21 PM, LawsonEnglish <LEnglish5 at cox.net> wrote:
>>>>>>
>>>>>> I’m not saying it isn’t stable.
>>>>>
>>>>> I know. I was just saying I don’t think anything has been broken recently, so the issue is not in the FFI per se.
>>>>>
>>>>>> However, the test functions are in the FFI plugin, which is a .bundle. I’ve been trying to use a .dylib.
>>>>>
>>>>> There’s a SqueakFFIPlugin dylib (a dylib in all but name) in SqueakFFIPlugin.bundle/Contents/MacOS/SqueakFFIPlugin. That’s what the FFI actually loads.
>>>>>
>>>>>> I realize that this should. make no difference, and yet, as I said, Craig Latta watched me do the whole thing from scratch via skype screensharing and he didn’t see an error.
>>>>>>
>>>>>> SO again: has anyone used a non-Squeak distribution/non-bundle with FFI lately?
>>>>>
>>>>> Yes.
>>>>>
>>>>>> I tested it on both Catlaina and Mojave and I get teh External module not found error, even with my own .dylib that isn’t hardcoded to sit in a specific directory.
>>>>>>
>>>>>> WHich leads to a suggestion: if it really is a Mac OS x issue, rather than my own stupidity, it may be necessary to start testing against a library that is merely sitting in the Resource directory, rather than inside a .bundle.
>>>>>>
>>>>>> WHich is why I’m still asking: has anyone used their own library (outside a .bundle) with FFI lately on Mac OS X, Catalina OR Mojave?
>>>>>
>>>>> Yes, and it is extremely tricky. I’ve been using libav and libffmpeg and others. I’ve found one has to examine carefully the output of otool -L and use install_name_tool to change the hard-coded paths of any other non-system Dublin’s a Bykov depends on and make sure one understands and uses @rpath. If your dylib uses any other dylib you’re going to have to do the same exploration.
>>>>>
>>>>>>
>>>>>> I’m still trying to figure out how to PUT a library into a .bundle, or I’d test my theory.
>>>>>
>>>>> Look at the vm build makefiles for macos; they do this and they can be configured to generate dylibs in a directory, etc.
>>>>>
>>>>> So first question, what’s the output of
>>>>> otool -L mylib
>>>>>
>>>>> (You can omit all the /System/Library ones)
>>>>>
>>>>>> L
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20200820/8dbd5894/attachment.html>
More information about the Squeak-dev
mailing list
|