当抽象类使用shared_ptr时,如何在nm或objdump中找到函数符号?

发布于 2024-11-25 13:54:40 字数 1541 浏览 4 评论 0原文

我将shared_ptr 用于抽象类ABC。 ABCImpl类是ABC的实现。 abc_ptr 是一个shared_ptr< ABC>指向 ABCImpl 对象。在调用函数中,abc_ptr将调用ABC类中的成员函数(func_in_ABC)之一。编译成功。但是当我使用 nm 或 objdump 时,我只能看到 abc_ptr 的符号。调用函数中没有显示 func_in_ABC() 的符号。

任何人都知道为什么,或者我如何获得调用函数中 func_in_ABC() 符号的输出?

代码如下: 在 ABC.h 中:

#include <boost/shared_ptr.hpp>

class ABC
{
    public:
        virtual void func_in_ABC(const int param) = 0;
};

typedef boost::shared_ptr<ABC> ABCPtr;
ABCPtr get_ABC_ptr();

在 ABCImpl.h 中:

#include "ABC.h"

class ABCImpl : public 
{
    public:
        ABCImpl() {}
        void func_in_ABC(const int param);
    private:
        int data;
};

在 ABCImpl.cpp 中:

#include "ABCImpl.h"

ABCPtr get_ABC_ptr()
{
        return ABCPtr(new ABCImpl());
}

void ABCImpl::func_in_ABC(const int param)
{
    data = param;
}

在调用函数 D.cpp 中:

#include "D.h"
#include "ABC.h"

void D::call_ABC()
{
    ABCPtr abc_ptr = get_ABC_ptr();
    abc_ptr->func_in_ABC(100);
}

nm 中 Do 的输出:

         U _Unwind_Resume
         U get_ABC_ptr()
0000000000000000 T D::call_ABC()
0000000000000000 W boost::shared_ptr<ABC>::operator->() const
0000000000000000 r boost::shared_ptr<ABC>::operator->() const::__PRETTY_FUNCTION__
         U __assert_fail
         U __gxx_personality_v0

如果我更改 ABC.h 中 func_in_ABC 的定义,则 D.cpp 的编译将失败。我认为编译 Do 时它会检查 ABC 类的定义,但是为什么我在调用者处找不到映射到 ABC 中定义的符号?

I use shared_ptr for an abstract class ABC. ABCImpl class is the implementation of ABC. abc_ptr is a shared_ptr< ABC> points to an ABCImpl objects. In caller function, abc_ptr will call one of the member function (func_in_ABC) in ABC class. The compile is successful. But when I use nm or objdump, I could only see the symbol for abc_ptr. There is no symbol displayed for func_in_ABC() in the caller function.

Anyone knows why, or how an I get the output for the symbol for func_in_ABC() in the caller function?

The code is as follows:
In ABC.h:

#include <boost/shared_ptr.hpp>

class ABC
{
    public:
        virtual void func_in_ABC(const int param) = 0;
};

typedef boost::shared_ptr<ABC> ABCPtr;
ABCPtr get_ABC_ptr();

In ABCImpl.h:

#include "ABC.h"

class ABCImpl : public 
{
    public:
        ABCImpl() {}
        void func_in_ABC(const int param);
    private:
        int data;
};

In ABCImpl.cpp:

#include "ABCImpl.h"

ABCPtr get_ABC_ptr()
{
        return ABCPtr(new ABCImpl());
}

void ABCImpl::func_in_ABC(const int param)
{
    data = param;
}

In caller function D.cpp:

#include "D.h"
#include "ABC.h"

void D::call_ABC()
{
    ABCPtr abc_ptr = get_ABC_ptr();
    abc_ptr->func_in_ABC(100);
}

The output for D.o from nm:

         U _Unwind_Resume
         U get_ABC_ptr()
0000000000000000 T D::call_ABC()
0000000000000000 W boost::shared_ptr<ABC>::operator->() const
0000000000000000 r boost::shared_ptr<ABC>::operator->() const::__PRETTY_FUNCTION__
         U __assert_fail
         U __gxx_personality_v0

If I change the definition of func_in_ABC in ABC.h, the compilation for D.cpp will fail. I think it will check the definition of class ABC when compiling D.o. But why I can't find the symbol at caller to map to the definition in ABC?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

为你拒绝所有暧昧 2024-12-02 13:54:40

由于 func_in_ABC 是一个虚函数,因此您实际上不需要符号名称来调用它。您只需要该特定虚拟函数的虚拟表中的偏移量。

如果将 func_in_ABC 设置为非虚拟,您应该会看到该符号显示在 nm 输出中。

Since func_in_ABC is a virtual function, you don't actually need the symbol name to call it. You just need the offset into the virtual table for that specific virtual function.

If you make func_in_ABC non-virtual, you should see the symbol show up in the nm output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文