[Xorp-hackers] non-virtual thunk

Victor Faion vfaion at gmail.com
Sun Jan 18 13:34:15 PST 2009


Hello,

I was trying to create a simple XORP process by following the
xorpdev_101 document but I ran into this error when running make,
something about a ``non-virtual thunk''.

/bin/sh ../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I.
-I.. -I..    -g -Werror -W -Wall -Wwrite-strings -Wcast-qual
-Wpointer-arith -Wcast-align -Woverloaded-virtual -ftemplate-depth-25
-pipe -MT xrl_bpsf_node.lo -MD -MP -MF .deps/xrl_bpsf_node.Tpo -c -o
xrl_bpsf_node.lo xrl_bpsf_node.cc
 g++ -DHAVE_CONFIG_H -I. -I.. -I.. -g -Werror -W -Wall -Wwrite-strings
-Wcast-qual -Wpointer-arith -Wcast-align -Woverloaded-virtual
-ftemplate-depth-25 -pipe -MT xrl_bpsf_node.lo -MD -MP -MF
.deps/xrl_bpsf_node.Tpo -c xrl_bpsf_node.cc -o xrl_bpsf_node.o
mv -f .deps/xrl_bpsf_node.Tpo .deps/xrl_bpsf_node.Plo
/bin/sh ../libtool --tag=CXX   --mode=link g++  -g -Werror -W -Wall
-Wwrite-strings -Wcast-qual -Wpointer-arith -Wcast-align
-Woverloaded-virtual -ftemplate-depth-25 -pipe   -o libbpsf.la
xrl_bpsf_node.lo  -lpcap -lcrypto  -lrt
rm -fr  .libs/libbpsf.a .libs/libbpsf.la
ar cru .libs/libbpsf.a  xrl_bpsf_node.o
ranlib .libs/libbpsf.a
creating libbpsf.la
(cd .libs && rm -f libbpsf.la && ln -s ../libbpsf.la libbpsf.la)
g++ -DHAVE_CONFIG_H -I. -I.. -I..    -g -Werror -W -Wall
-Wwrite-strings -Wcast-qual -Wpointer-arith -Wcast-align
-Woverloaded-virtual -ftemplate-depth-25 -pipe -MT xorp_bpsf.o -MD -MP
-MF .deps/xorp_bpsf.Tpo -c -o xorp_bpsf.o xorp_bpsf.cc
mv -f .deps/xorp_bpsf.Tpo .deps/xorp_bpsf.Po
/bin/sh ../libtool --tag=CXX   --mode=link g++  -g -Werror -W -Wall
-Wwrite-strings -Wcast-qual -Wpointer-arith -Wcast-align
-Woverloaded-virtual -ftemplate-depth-25 -pipe   -o xorp_bpsf
xorp_bpsf.o libbpsf.la ../xrl/targets/libbpsfbase.la
../libxipc/libxipc.la ../libcomm/libcomm.la ../libxorp/libxorp.la
-lpcap -lcrypto  -lrt
g++ -g -Werror -W -Wall -Wwrite-strings -Wcast-qual -Wpointer-arith
-Wcast-align -Woverloaded-virtual -ftemplate-depth-25 -pipe -o
xorp_bpsf xorp_bpsf.o  ./.libs/libbpsf.a
../xrl/targets/.libs/libbpsfbase.a ../libxipc/.libs/libxipc.a
../libcomm/.libs/libcomm.a ../libxorp/.libs/libxorp.a -lpcap -lcrypto
-lrt
./.libs/libbpsf.a(xrl_bpsf_node.o):(.rodata._ZTV11XrlBpsfNode[vtable
for XrlBpsfNode]+0xa8): undefined reference to
`XrlBpsfNode::bpsf_0_1_set_nexthop4(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&, unsigned int
const&, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int const&, IPv4 const&)'
./.libs/libbpsf.a(xrl_bpsf_node.o):(.rodata._ZTV11XrlBpsfNode[vtable
for XrlBpsfNode]+0xb0): undefined reference to
`XrlBpsfNode::bpsf_0_1_print_hello_world_and_msg(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
std::basic_string<char, std::char_traits<char>, std::allocator<char>
>&)'
./.libs/libbpsf.a(xrl_bpsf_node.o):(.rodata._ZTV11XrlBpsfNode[vtable
for XrlBpsfNode]+0x180): undefined reference to `non-virtual thunk to
XrlBpsfNode::bpsf_0_1_set_nexthop4(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&, unsigned int
const&, std::basic_string<char, std::char_traits<char>,
std::allocator<char> > const&, unsigned int const&, IPv4 const&)'
./.libs/libbpsf.a(xrl_bpsf_node.o):(.rodata._ZTV11XrlBpsfNode[vtable
for XrlBpsfNode]+0x188): undefined reference to `non-virtual thunk to
XrlBpsfNode::bpsf_0_1_print_hello_world_and_msg(std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
std::basic_string<char, std::char_traits<char>, std::allocator<char>
>&)'
collect2: ld returned 1 exit status
make: *** [xorp_bpsf] Error 1


I'm not sure what is causing this. Here are the xrl_bpsf_node.{hh,cc} files:

#ifndef __BPSF_XRL_BPSF_NODE_HH__
#define __BPSF_XRL_BPSF_NODE_HH__

#include "libxipc/xrl_std_router.hh"
#include "xrl/targets/bpsf_base.hh"

class XrlBpsfNode : public XrlStdRouter,
		    public XrlBpsfTargetBase {
public:
    XrlBpsfNode(EventLoop&      eventloop,
                const string&   class_name,
                const string&   finder_hostname,
                uint16_t        finder_port);
    ~XrlBpsfNode();
    /**
     * Get a reference to the XrlRouter instance.
     *
     * @return a reference to the XrlRouter (@ref XrlRouter) instance.
     */
    XrlRouter&  xrl_router() { return *this; }
   /**
     * Startup the node operation.
     *
     * @return XORP_OK on success, otherwise XORP_ERROR.
     */
    int startup();

    int shutdown();

    /**
     * Test if the node processing is done.
     *
     * @return true if the node processing is done, otherwise false.
     */
    bool is_done() const { return true; }


protected:
    //
    // XRL target methods
    //

    /**
     *  Get name of Xrl Target
     */
    XrlCmdError common_0_1_get_target_name(
	// Output values,
	string&	name);

    /**
     *  Get version string from Xrl Target
     */
    XrlCmdError common_0_1_get_version(
	// Output values,
	string&	version);

    /**
     *  Get status of Xrl Target
     */
    XrlCmdError common_0_1_get_status(
	// Output values,
	uint32_t&	status,
	string&	reason);

    /**
     *  Request clean shutdown of Xrl Target
     */
    XrlCmdError common_0_1_shutdown();

    /**
     *  Enable/disable/start/stop Bpsf.
     *
     *  @param enable if true, then enable Bpsf, otherwise disable it.
     */
    XrlCmdError bpsf_0_1_enable_bpsf(
	// Input values,
	const bool&	enable);

    XrlCmdError bpsf_0_1_start_bpsf();

    XrlCmdError bpsf_0_1_stop_bpsf();

    /**
     *  Set the peer's AS number.
     *
     *  @param next_hop IPv4 nexthop.
     */
    XrlCmdError bpsf_0_1_set_nexthop4(
        // Input values,
        const string&   local_ip,
        const uint32_t& local_port,
        const string&   peer_ip,
        const uint32_t& peer_port,
        const IPv4&     next_hop);

    XrlCmdError bpsf_0_1_print_hello_world_and_msg(
        // Input values,
        const string&   msg,
        // Output values,
        string& num);

    /**
     *  Enable/disable the Bpsf trace log for all operations.
     *
     *  @param enable if true, then enable the trace log, otherwise disable it.
     */
    XrlCmdError bpsf_0_1_enable_log_trace_all(
	// Input values,
	const bool&	enable);

};

#endif // __BPSF_XRL_BPSF_NODE_HH__


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



#include "bpsf_module.h"

#include "libxorp/xorp.h"
//#include "libxorp/xlog.h"
//#include "libxorp/debug.h"
//#include "libxorp/ipvx.hh"
#include "libxorp/status_codes.h"

#include "xrl_bpsf_node.hh"

XrlBpsfNode::XrlBpsfNode(EventLoop&     eventloop,
                         const string&  class_name,
                         const string&  finder_hostname,
                         uint16_t       finder_port)
  : XrlStdRouter(eventloop, class_name.c_str(), finder_hostname.c_str(),
                   finder_port),
    XrlBpsfTargetBase(&xrl_router())
{
  printf("%s\n", "creating XrlBpsfNode");
}

XrlBpsfNode::~XrlBpsfNode() {
  printf("%s\n", "deleting XrlBpsfNode");
}

int XrlBpsfNode::shutdown() {
  printf("%s\n", "shutting down XrlBpsfNode");
  return (XORP_OK);
}

int XrlBpsfNode::startup() {
  printf("%s\n", "starting up XrlBpsfNode");
  return (XORP_OK);
}

//
// XRL target methods
//

/**
 *  Get name of Xrl Target
 */
XrlCmdError XrlBpsfNode::common_0_1_get_target_name(
    // Output values,
    string&	name)
{
    name = xrl_router().class_name();

    return XrlCmdError::OKAY();
}

/**
 *  Get version string from Xrl Target
 */
XrlCmdError XrlBpsfNode::common_0_1_get_version(
    // Output values,
    string&	version)
{
    version = XORP_MODULE_VERSION;

    return XrlCmdError::OKAY();
}

/**
 *  Get status of Xrl Target
 */
XrlCmdError XrlBpsfNode::common_0_1_get_status(
    // Output values,
    uint32_t&	status,
    string&	reason)
{
    status = NULL;
    reason = "testing protocol";

    return XrlCmdError::OKAY();
}

/**
 *  Request clean shutdown of Xrl Target
 */
XrlCmdError XrlBpsfNode::common_0_1_shutdown()
{
    string error_msg;

    if (shutdown() != XORP_OK) {
	error_msg = c_format("Failed to shutdown Bpsf");
	return XrlCmdError::COMMAND_FAILED(error_msg);
    }

    return XrlCmdError::OKAY();
}

/**
 *  Enable/disable/start/stop Bpsf.
 *
 *  @param enable if true, then enable Bpsf, otherwise disable it.
 */
XrlCmdError XrlBpsfNode::bpsf_0_1_enable_bpsf(
    // Input values,
    const bool&	enable)
{
  printf("%s\n", enable ? "enabling bpsf" : "disabling bpsf");
  return XrlCmdError::OKAY();
}

XrlCmdError XrlBpsfNode::bpsf_0_1_start_bpsf()
{
    // XLOG_UNFINISHED();
  printf("%s\n", "starting up XrlBpsfNode xrl");

  return XrlCmdError::OKAY();
}

XrlCmdError XrlBpsfNode::bpsf_0_1_stop_bpsf() {
   // XLOG_UNFINISHED();

  printf("%s\n", "stopping XrlBpsfNode");
  return XrlCmdError::OKAY();
}

/**
 *  Pure-virtual function that needs to be implemented to:
 *
 *  Set the peer's AS number.
 *
 *  @param next_hop IPv4 nexthop.
 */
XrlCmdError bpsf_0_1_set_nexthop4(
        // Input values,
        const string&   local_ip,
        const uint32_t& local_port,
        const string&   peer_ip,
        const uint32_t& peer_port,
        const IPv4&     next_hop) {
  printf("%s: %s %d %s %d %s \n", "setting nexthop now...",
    local_ip.c_str(), local_port, peer_ip.c_str(),
    peer_port, next_hop.str().c_str());
  return XrlCmdError::OKAY();
}

XrlCmdError bpsf_0_1_print_hello_world_and_msg(
        // Input values,
        const string&   msg,
        // Output values,
        string& num) {
  printf("%s: %s\n", "hello world", msg.c_str());
  num = "return message from bpsf_0_1_print_hello_world_and_msg";
  return XrlCmdError::OKAY();
}

/**
 *  Enable/disable the Bpsf trace log for all operations.
 *
 *  @param enable if true, then enable the trace log, otherwise disable it.
 */
XrlCmdError XrlBpsfNode::bpsf_0_1_enable_log_trace_all(
    // Input values,
    const bool&	enable)
{
  printf("%s\n", enable ? "enabling bpsf logging" : "disabling bpsf logging");

  return XrlCmdError::OKAY();
}


I am using xorp-1.6 compiled from source on Linux kernel
2.6.20.3-ubuntu1 x86_64, but I think I'm just making a stupid mistake
somewhere, has anyone had this problem or know how to fix it?

Cheers,
Victor



More information about the Xorp-hackers mailing list