NLFFI: DynLinkage.open_lib raises DynLinkError - sml

I'm exploring NLFFI (No Longer Foreign Function Interface), its implementation in SML/NJ. The "math" example works, but "pdb" gives an error:
FFI/pdb.cm:53.5-53.21 Error: link-time exception in user program
(pdb.cm):FFI/(pdb.cm):../pdbhandle.sml
DynLinkErrornlffi/lib/memory/linkage-dlopen.sml:67.26-67.40
/usr/lib/smlnj/bin/sml: Fatal error -- Uncaught exception Link with
0 raised at ../cm/compile/link.sml:357.28-357.35
My shared library gives the same error. I think that the error is in "pdbhandle.sml" where dynamic linking goes, because "math" links the SML/NJ runtime library DynLinkage.main_lib and "pdb" links its own library. I tried to load the library manually:
sml -m "\$c/internals/c-int.cm"
and
DynLinkage.open_lib { name = "./pdb.so", global = true, lazy = true };
I get
uncaught exception DynLinkError raised at:
nlffi/lib/memory/linkage-dlopen.sml:67.26-67.40
DynLinkage.open_lib { name = "/usr/lib/libgmp.so.10.2.0", global =
true, lazy = true };
gives the same error.
$ ls -l /usr/lib/libgmp.so.10.2.0
-rwxr-xr-x 1 root root 488208 бер 26 01:03 /usr/lib/libgmp.so.10.2.0
I see that DynLinkError has an argument, but SML/NJ does not show it. (BTW, is it a normal behavior?) I'm stuck here because I don't know what the error message is.

It turned out that I was linking a library for the x86_64 architecture, but SML/NJ is x86-program. (I'm using ArchLinux x86_64 Multilib.)
DynLinkage.open_lib { name = "/usr/lib32/libgmp.so.10.2.0"
, global = true, lazy = true };
works.
I print an argument of an exception by an ugly expression
(DynLinkage.open_lib { name = lib_file_name, global = true, lazy = true }
; raise Div)
handle DynLinkage.DynLinkError x => x;

Related

Is it possible to get the resolved path of a broken symbolic link?

I've been unable to find a way to get the target path of a broken symbolic link in Crystal:
Dir.cd "/tmp"
`ln -s a b`
puts File.exists?(b) # false
puts File.symlink?(b) # true
Is there anything in the standard library to get the address the broken link points to?
This is done on Linux/MacOS via readlink, which unfortunately hasn't been implemented in the standard library yet. This is tracked in issue #3284 on GitHub, and kostya has posted a version that seems to work in that issue.
Using his code:
lib LibC
fun readlink(pathname : Char*, buf : Char*, bufsiz : SizeT) : SizeT
end
def File.readlink(path)
buf = uninitialized UInt8[1024]
size = LibC.readlink(path.to_unsafe, buf.to_unsafe, 1024).to_i32
if size == -1
raise Errno.new("readlink")
elsif size > 1024
raise "buffer too small"
else
return String.new(buf.to_unsafe, size)
end
end
and then calling that function:
File.symlink("a", "b")
puts File.readlink("b") # => a
Note however that you'll probably need to do some work to get an absolute path. It might just be more feasible to use the command line version directly, since you can pass the -f flag which gives an absolute path:
File.symlink("a", "b")
puts `readlink -f b` # => /path/to/a
The -f-flag isn't available on MacOS though.

Bitbake the latest Gstreamer in Yocto Morty

I would like to bitbake the latest Gstreamer in Yocto Morty, but the error has occured and could not implement the Gstreamer.
I found the gstreamer 1.12.2 recipe at https://github.com/dv1/meta-gstreamer1.0.
So I put meta-gstreamer1.0 directory in sources directory and add BBLAYERS += " ${BSPDIR}/sources/meta-gstreamer1.0 " to build_fb/bblayers.conf.
Then I bitbaked fsl-image-gui and following errors are occured.
ERROR: /home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gstreamer1.0-omx_1.12.2.bb: Error executing a python function in <code>:
The stack trace of python calls that resulted in this exception/failure was:
File: '<code>', lineno: 13, function: <module>
0009:__anon_35__home_***_var_fslc_yocto_sources_poky_meta_classes_devshell_bbclass(d)
0010:__anon_108__home_***_var_fslc_yocto_sources_poky_meta_classes_sstate_bbclass(d)
0011:__anon_45__home_***_var_fslc_yocto_sources_poky_meta_classes_blacklist_bbclass(d)
0012:__anon_158__home_***_var_fslc_yocto_sources_poky_meta_classes_siteinfo_bbclass(d)
*** 0013:__anon_30__home_***_var_fslc_yocto_sources_meta_gstreamer1_0_recipes_multimedia_gstreamer_gstreamer1_0_omx_inc(d)
File: '/home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc', lineno: 22, function: __anon_30__home_***_var_fslc_yocto_sources_meta_gstreamer1_0_recipes_multimedia_gstreamer_gstreamer1_0_omx_inc
0018:EXTRA_OECONF += "--disable-valgrind --with-omx-target=${GSTREAMER_1_0_OMX_TARGET}"
0019:
0020:python __anonymous () {
0021: omx_target = d.getVar("GSTREAMER_1_0_OMX_TARGET")
*** 0022: if omx_target in ['generic', 'bellagio']:
0023: # Bellagio headers are incomplete (they are missing the OMX_VERSION_MAJOR,#
0024: # OMX_VERSION_MINOR, OMX_VERSION_REVISION, and OMX_VERSION_STEP macros);
0025: # appending a directory path to gst-omx' internal OpenMAX IL headers fixes this
0026: d.appendVar("CFLAGS", " -I${S}/omx/openmax")
Exception: TypeError: getVar() missing 1 required positional argument: 'expand'
ERROR: ExpansionError during parsing /home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.12.2.bb
Traceback (most recent call last):
File "/home/***/var-fslc-yocto/sources/poky/meta/classes/base.bbclass", line 375, in __anon_656__home_***_var_fslc_yocto_sources_poky_meta_classes_base_bbclass(d=<bb.data_smart.DataSmart object at 0x7fb7a8dcff98>):
pkgconfig = (d.getVar('PACKAGECONFIG', True) or "").split()
> pn = d.getVar("PN", True)
File "/home/***/var-fslc-yocto/sources/poky/bitbake/lib/bb/data_smart.py", line 569, in DataSmart.getVar(var='PACKAGECONFIG', expand=True, noweakdefault=False, parsing=False):
def getVar(self, var, expand, noweakdefault=False, parsing=False):
> return self.getVarFlag(var, "_content", expand, noweakdefault, parsing)
File "/home/***/var-fslc-yocto/sources/poky/bitbake/lib/bb/data_smart.py", line 737, in DataSmart.getVarFlag(var='PACKAGECONFIG', flag='_content', expand=True, noweakdefault=False, parsing=False):
cachename = var + "[" + flag + "]"
> value = self.expand(value, cachename)
File "/home/***/var-fslc-yocto/sources/poky/bitbake/lib/bb/data_smart.py", line 410, in DataSmart.expand(s=" ${GSTREAMER_ORC} ${PACKAGECONFIG_GL} ${#bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} ${#bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan', d)} ${#bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} bz2 curl dash dtls hls neon rsvg sbc smoothstreaming sndfile uvch264 webp ", varname='PACKAGECONFIG'):
def expand(self, s, varname = None):
> return self.expandWithRefs(s, varname).value
File "/home/***/var-fslc-yocto/sources/poky/bitbake/lib/bb/data_smart.py", line 400, in DataSmart.expandWithRefs(s=" orc gles2 egl ${#bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} ${#bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan', d)} ${#bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} bz2 curl dash dtls hls neon rsvg sbc smoothstreaming sndfile uvch264 webp ", varname='PACKAGECONFIG'):
except Exception as exc:
> raise ExpansionError(varname, s, exc) from exc
bb.data_smart.ExpansionError: Failure expanding variable PACKAGECONFIG, expression was orc gles2 egl ${#bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} ${#bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan', d)} ${#bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} bz2 curl dash dtls hls neon rsvg sbc smoothstreaming sndfile uvch264 webp which triggered exception AttributeError: module 'bb.utils' has no attribute 'filter'
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
I found the error "Exception: TypeError: getVar() missing 1 required positional argument: 'expand'" is fixed in Yocto 2.3(Pyro) at https://bugzilla.yoctoproject.org/show_bug.cgi?id=3314.
Furthermore, YP core says gstreamer version for Yocto Morty is 1.8.3 (see https://www.yoctoproject.org/downloads/core/morty22 updates tab).
Do these things mean that we cannot implement gstreamer 1.12.2 or later version in Yocto Morty? Are there any way to do it? Do we have to use Yocto Pyro or later version if we want to implement gstreamer 1.12?
Environment
Yocto Morty (2.2.1) https://github.com/varigit/variscite-bsp-platform/tree/morty#variscite-release-notes
PS:
I rewrite getVar and bitbake proceeded.However I got following error.Would someone help me?
ERROR: gstreamer1.0-plugins-base-1.12.2-r0 do_populate_sysroot: The recipe gstreamer1.0-plugins-base is trying to install files into a shared area when those files already exist. Those files and their manifest location are:
/home/***/var-fslc-yocto/build_fb/tmp/sysroots/imx6ul-var-dart/usr/lib/gstreamer-1.0/libgstrawparse.la
Matched in b'manifest-imx6ul-var-dart-gstreamer1.0-plugins-bad.populate_sysroot'
/home/***/var-fslc-yocto/build_fb/tmp/sysroots/imx6ul-var-dart/usr/lib/gstreamer-1.0/libgstrawparse.so
Matched in b'manifest-imx6ul-var-dart-gstreamer1.0-plugins-bad.populate_sysroot'
Please verify which recipe should provide the above files.
The build has stopped as continuing in this scenario WILL break things, if not now, possibly in the future (we've seen builds fail several months later). If the system knew how to recover from this automatically it would however there are several different scenarios which can result in this and we don't know which one this is. It may be you have switched providers of something like virtual/kernel (e.g. from linux-yocto to linux-yocto-dev), in that case you need to execute the clean task for both recipes and it will resolve this error. It may be you changed DISTRO_FEATURES from systemd to udev or vice versa. Cleaning those recipes should again resolve this error however switching DISTRO_FEATURES on an existing build directory is not supported, you should really clean out tmp and rebuild (reusing sstate should be safe). It could be the overlapping files detected are harmless in which case adding them to SSTATE_DUPWHITELIST may be the correct solution. It could also be your build is including two different conflicting versions of things (e.g. bluez 4 and bluez 5 and the correct solution for that would be to resolve the conflict. If in doubt, please ask on the mailing list, sharing the error and filelist above.
ERROR: gstreamer1.0-plugins-base-1.12.2-r0 do_populate_sysroot: If the above message is too much, the simpler version is you're advised to wipe out tmp and rebuild (reusing sstate is fine). That will likely fix things in most (but not all) cases.
ERROR: gstreamer1.0-plugins-base-1.12.2-r0 do_populate_sysroot: Function failed: sstate_task_postfunc
ERROR: Logfile of failure stored in: /home/***/var-fslc-yocto/build_fb/tmp/work/armv7at2hf-neon-fslc-linux-gnueabi/gstreamer1.0-plugins-base/1.12.2-r0/temp/log.do_populate_sysroot.99466
ERROR: Task (/home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.12.2.bb:do_populate_sysroot) failed with exit code '1'
ERROR: gstreamer1.0-plugins-base-1.12.2-r0 do_package: Error executing a python function in exec_python_func() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
0001:
*** 0002:split_gstreamer10_packages(d)
0003:
File: '/home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gst-plugins-package.inc', lineno: 6, function: split_gstreamer10_packages
0002:PACKAGESPLITFUNCS_append = " set_metapkg_rdepends "
0003:
0004:python split_gstreamer10_packages () {
0005: gst_libdir = d.expand('${libdir}/gstreamer-${LIBV}')
*** 0006: postinst = d.getVar('plugin_postinst')
0007: glibdir = d.getVar('libdir')
0008:
0009: do_split_packages(d, glibdir, '^lib(.*)\.so\.*', 'lib%s', 'gstreamer %s library', extra_depends='', allow_links=True)
0010: do_split_packages(d, gst_libdir, 'libgst(.*)\.so$', d.expand('${PN}-%s'), 'GStreamer plugin for %s', postinst=postinst, extra_depends='')
Exception: TypeError: getVar() missing 1 required positional argument: 'expand'
ERROR: gstreamer1.0-plugins-base-1.12.2-r0 do_package: Function failed: split_gstreamer10_packages
ERROR: Logfile of failure stored in: /home/***/var-fslc-yocto/build_fb/tmp/work/armv7at2hf-neon-fslc-linux-gnueabi/gstreamer1.0-plugins-base/1.12.2-r0/temp/log.do_package.99465
ERROR: Task (/home/***/var-fslc-yocto/sources/meta-gstreamer1.0/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.12.2.bb:do_package) failed with exit code '1'
Since you are migrating recipe for older version of Yocto into a newer, you must be facing consequences of this change in Yocto: expand parameter (the second one) to getVar() and getVarFlag() has become mandatory (from bitbake user manual for morty), previously it was defaulted to False. So, you should correct all occurrences of these operations and add at least False as a second argument.

Datapath#ports is kept for compatibility

I am trying to get ryu to run, especially the topology discovery.
Now I am running the demo application for that under ryu/topology/dumper.py, which is supposed to dump all topology events. I am in the ryu/topology direcory and run it using ryu-manager dumper.py. The version of ryu-manager is 2.23.2.
Shortly after starting it gives me this error:
/usr/local/lib/python2.7/dist-packages/ryu/topology/switches.py:478: UserWarning:
Datapath#ports is kept for compatibility with the previous openflow versions (< 1.3).
This not be updated by EventOFPPortStatus message. If you want to be updated,
you can use 'ryu.controller.dpset' or 'ryu.topology.switches'.
for port in dp.ports.values():
What's really weird to me is that it recommends to use ryu.topology.switches, but that error is triggered by line 478 of that very file!
The function in question is this:
class Switches(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION, ofproto_v1_2.OFP_VERSION,
ofproto_v1_3.OFP_VERSION, ofproto_v1_4.OFP_VERSION]
_EVENTS = [event.EventSwitchEnter, event.EventSwitchLeave,
event.EventPortAdd, event.EventPortDelete,
event.EventPortModify,
event.EventLinkAdd, event.EventLinkDelete]
DEFAULT_TTL = 120 # unused. ignored.
LLDP_PACKET_LEN = len(LLDPPacket.lldp_packet(0, 0, DONTCARE_STR, 0))
LLDP_SEND_GUARD = .05
LLDP_SEND_PERIOD_PER_PORT = .9
TIMEOUT_CHECK_PERIOD = 5.
LINK_TIMEOUT = TIMEOUT_CHECK_PERIOD * 2
LINK_LLDP_DROP = 5
#...
def _register(self, dp):
assert dp.id is not None
self.dps[dp.id] = dp
if dp.id not in self.port_state:
self.port_state[dp.id] = PortState()
for port in dp.ports.values(): # THIS LINE
self.port_state[dp.id].add(port.port_no, port)
Has anyone else encountered this problem before? How can I fix it?
I ran into the same issue (depending on your application, maybe it's not a problem, just a warning that you can ignore). Here is what I figured out after a find . -type f | xargs grep "ports is kept"
This warning is triggered in ryu.topology.switches, by a call to _get_ports() in class Datapath of file ryu/controller/controller.py.
class Datapath(ofproto_protocol.ProtocolDesc):
#......
def _get_ports(self):
if (self.ofproto_parser is not None and
self.ofproto_parser.ofproto.OFP_VERSION >= 0x04):
message = (
'Datapath#ports is kept for compatibility with the previous '
'openflow versions (< 1.3). '
'This not be updated by EventOFPPortStatus message. '
'If you want to be updated, you can use '
'\'ryu.controller.dpset\' or \'ryu.topology.switches\'.'
)
warnings.warn(message, stacklevel=2)
return self._ports
def _set_ports(self, ports):
self._ports = ports
# To show warning when Datapath#ports is read
ports = property(_get_ports, _set_ports)
My understanding is that if the warning is from ryu.topology.switches or ryu.controller.dpset, you can ignore it; because those two classes handle the event for you. But if you use Datapath directly, port status is not updated automatically. Anyone correct me if I'm wrong.
class Switches(app_manager.RyuApp):
#......
#set_ev_cls(ofp_event.EventOFPPortStatus, MAIN_DISPATCHER)
def port_status_handler(self, ev):
I have encountered that problem before but I just ignored it and so far every thing has been working as it was expected.
If you are trying to learn the topology I would recommend using ryu.topology.api. i.e.
from ryu.topology.api import get_switch, get_link
There is this tutorial. However there are some of the stuff missing.
Here is what I have so far: Controller.py
In the Controller.py the two functions get_switch(self, None) and get_link(self, None) would give you list of links and switches.

pxssh.pxssh() is producing error in python

I got the following errors when I run pxssh.pxssh() in python. Please let me know what I am missing here.
Exception AttributeError: "'pxssh' object has no attribute 'closed'" in <bound method pxssh.__del__ of <pexpect.pxssh.pxssh object at 0x10d98e910>> ignored
.........
File "/Users/any_user/system/somelibrary_lib.py", line 377, in login
ssh = pxssh.pxssh(maxread=read_buffer, ignore_sighup=False)
TypeError: __init__() got an unexpected keyword argument 'ignore_sighup'
.........
I faced the same problem. the solution was like this :
s = pxssh.pxssh(timeout=time_out, maxread=2000000)
s.SSH_OPTS += " -o StrictHostKeyChecking=no"
s.SSH_OPTS += " -o UserKnownHostsFile=/dev/null"
You should add this two options
I faced the same problem. Solution I found was to use SSH_OPTS property of pxssh object instead of options ctor (__init__) argument.
So my code looks like this:
s = pxssh.pxssh()
s.SSH_OPTS += " -o StrictHostKeyChecking=no"
s.force_password = True
s.login(ip, user, passwd)
It doesn't throw AttributeError exception on module initialization and TypeError too.
But it still doesn't work for me. If the remote server has MOTD or some shell initialization on startup, it would break the logic of pxssh. I made the following trick:
s.login(ip, user, passwd, original_prompt = "Last login:")
Shell writes on each successful login line like Last login: %date% from %ip%. I used it to verify successful logon. Now, using s you can execute remote commands.
Original (default) value for original_prompt is r"[#$]". May be you need somehow to combine them for correct pxssh work. May be you need to add > to original_prompt if you are connecting to SQL shell or Cisco devices.

error bash: syntax error near unexpected token `(' my code is correct

I am trying to implement a hash function and here is my code:
import BitVector
import glob
path = '/home/vguda/Desktop/.txt'
files=glob.glob(path)
hash = BitVector.BitVector(size = 32)
hash.reset(0)
i = 0
for file in files:
bv = BitVector.BitVector( filename = file )
while 1 :
bv1 = bv.read_bits_from_file(8)
if str(bv1) == "":
break
hash[0:8] = bv1 ^ hash[0:8]
hash >> 8
i = i+1
hash_str = ""
hash_str = str( hash )
text_file = open("/home/vguda/Desktop/result.txt ","w")
text_file.write("Hash Code is %s" %hash_str)
text_file.close()
print hash
print (i)
The displayed error is:
"bash: syntax error near unexpected token `('
First, perhaps this happened in copy and paste, but your indenting in your loop is all messed up, I'm not sure which blocks go where.
When you run things in the shell, you need to either tell python to run it:
python myscript.py
Or, put the following line as the first thing in your program to tell bash to run it as a python program:
#!/usr/bin/python
Currently, bash is trying to run your python program as a bash script, and obviously running into syntax errors.