VMware Cloud Community
jobegod
Contributor
Contributor

DLSYM: Failed to resolve SSLv3_method: /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2: undefined symbol: SSLv3_method

vmrc v10.0.3 not run in linux debian 64bit 

The error:

DLSYM: Failed to resolve SSLv3_method: /usr/lib/x86_64-linux-gnu/libssl.so.1.0.2: undefined symbol: SSLv3_method

Thanks

10 Replies
FlowTraders
Contributor
Contributor

Same here on Debian 9.5. Linking libssl.so to libssl.so.1.0.0 or libssl.so.1.1 doesn't help

0 Kudos
bitterxx
Contributor
Contributor

Same issue here, also with debian testing

0 Kudos
PinkFreud
Contributor
Contributor

I ran into this as well.  After realizing that vmware ships it's own libraries, installed in /usr/lib/vmware/lib, I decided to try preloading vmware's SSL lib:

$ LD_PRELOAD=/usr/lib/vmware/lib/libssl.so.1.0.2/libssl.so.1.0.2 vmrc

Loop on signal 11.

Better, but not quite there yet.

$ ldd `which vmrc`

    not a dynamic executable

Well, we can't easily see what libs this needs, as it's statically compiled.  Damn.  At least we shouldn't break it by replacing LD_PRELOAD with LD_LIBRARY_PATH:

$ LD_LIBRARY_PATH=/usr/lib/vmware/lib/libssl.so.1.0.2 vmrc

Loop on signal 11.

Vmware ships a lot of libraries in this tree, and it's not easy to figure out which one that's being called from the system libraries is breaking vmrc, so I decided to get a bit creative: Load *every* library that vmware ships.

$ cd /usr/lib/vmware/lib ; LD_LIBRARY_PATH=$(for i in */; do echo -n $(pwd)/${i%/}:; done) vmrc

I/O warning : failed to load external entity "/etc/vmware/hostd/proxy.xml"

vmrc: requires either a host or a VMRC URI as arguments.

Try 'vmrc --help' for more information.

Voila!

We can wrap vmrc in a script:

#!/bin/bash

libdir=/usr/lib/vmware/lib

[ -d "$libdir" ] || exit 1

exec=/usr/bin/vmrc

[ -x "$exec" ] || exit 1

cd "$libdir"

LIBPATHS="$(for i in */; do echo -n $(pwd)/${i%/}:; done)"

LD_LIBRARY_PATH="$LIBPATHS" "$exec" $@

... which works to launch vmrc, until vmware removes their silly reliance on SSLv3, which is long dead.

cooreilly
Contributor
Contributor

Curse the fact that I have but one like to give to this comment.

Thank you very much.

0 Kudos
RodrigoBash
Contributor
Contributor

It works... I can launch it, but for some reason it can't connect to my remote moid

anyways Thanks a lot

0 Kudos
agarcia20111014
Contributor
Contributor

That script works if invoked from console but where should I put it to make the web client calling it instead of the stock vmrc script (that your script calls also)?

Thank you!

0 Kudos
ElkhanM
Contributor
Contributor

At the time of writing, I can confirm that VRMC 10.0.3-9300449 works like a charm on Debian Buster/Testing amd64

OpenSSL Version: OpenSSL 1.1.1a  20 Nov 2018

Kernel: Linux 4.18.0-3-amd64 #1 SMP Debian 4.18.20-2 (2018-11-23) x86_64 GNU/Linux

0 Kudos
silvarenato
Contributor
Contributor

Hello!

thank you!

working perfectly!

0 Kudos
mfirth
Enthusiast
Enthusiast

Hi,

The reason "ldd `which vmrc`" returns "not a dynamic executable" (at least on my system) is that /usr/bin/vmrc is actually a script itself.

It would probably be better to merge the VMware script and your script, rather than wrapping one script around another!

I will have a go at this, but you probably know better than I will what would be needed.

The vmrc script is:

----------------------------------------------------

#!/usr/bin/env bash

#

# Copyright 2005-2008 VMware, Inc.  All rights reserved.

#

# Wrapper for a binary. Ensure that the binary will find all the

# shared libraries it needs. If a shared library is not available from

# any of the standard system-wide locations, we provide it from the

# location where the VMware software is installed.

#

# The binary must have the same name in BINDIR as it does in LIBDIR/bin.

#

set -e

ROOT_REQUIRED=no

ETCDIR=/etc/vmware

. $ETCDIR/bootstrap

export PRODUCT_NAME="VMware Remote Console"

libdir="$LIBDIR"/vmware

uid=`id -u` || exit 1

if [ "$ROOT_REQUIRED" = "yes" -a $uid -ne 0 ]; then

   "$BINDIR"/vmware-gksu "$0" "$@"

else

   binary="`basename "$0"`"

   exec "$libdir"/bin/"$binary" "$@"

fi

exit 1

----------------------------------------------------

Because of the way it's been done, it also prevents replacing /usr/bin/vmrc with your script, and renaming the VMware script to something else, as it uses '$0' to determine what executable to run.

0 Kudos
mfirth
Enthusiast
Enthusiast

Hi,

Merging the two was actually relatively straightforward, except that I haven't found a way to escape one part to work correctly if there are spaces in the VMware library path (which there aren't for the default locations). The script I have so far is:

----------------------------------------------------------------

#!/usr/bin/env bash

#

# Copyright 2005-2008 VMware, Inc.  All rights reserved.

#

# Wrapper for a binary. Ensure that the binary will find all the

# shared libraries it needs. If a shared library is not available from

# any of the standard system-wide locations, we provide it from the

# location where the VMware software is installed.

#

# The binary must have the same name in BINDIR as it does in LIBDIR/bin.

#

set -e

ROOT_REQUIRED=no

ETCDIR=/etc/vmware

. $ETCDIR/bootstrap

export PRODUCT_NAME="VMware Remote Console"

libdir="$LIBDIR"/vmware

uid=`id -u` || exit 1

LIBPATHS="$(cd $libdir/lib ; for i in */; do echo -n $(pwd)/${i%/}:; done)"

if [ "$ROOT_REQUIRED" = "yes" -a $uid -ne 0 ]; then

   "$BINDIR"/vmware-gksu "$0" "$@"

else

   binary="`basename "$0"`"

   LD_LIBRARY_PATH="$LIBPATHS" exec "$libdir"/bin/"$binary" "$@"

fi

exit 1

----------------------------------------------------------------

The "LIBPATHS" line is from your script, and then the LD_LIBRARY_PATH="$LIBPATHS" part of your script is prepended to VMware's line to execute the real binary

There is probably a more elegant way to do it, but it removes this error