Page 1 of 1

C++ Undefined Reference to .rodata._ZTI9Port32Bit[_ZT) Error

Posted: Thu Apr 28, 2022 9:28 am
by Mehmetdev1
C++ Undefined Reference to .rodata._ZTI9Port32Bit[_ZT There Is An Error How Can I Solve It. Source Codes. I'm leaving the screenshot of the error and my Github Repository.

Github Reposity: https://github.com/mehmetprogramci/Kapilar_OS

Port.cpp Source Code:

Code: Select all

#include "port.h"

Port::Port(uint16_t portnumber)
{
  this ->portnumber = portnumber;
}

Port::~Port()
{
}



Port8Bit::Port8Bit(uint16_t portnumber)
: Port(portnumber)
{
}

Port8Bit::~Port8Bit()
{
}

void Port8Bit::Write(uint8_t data)
{
   __asm__ volatile("outb %0, %1" : : "a" (data), "Nd" (portnumber));
}

uint8_t Port8Bit::Read()
{
     uint8_t result;
    __asm__ volatile("inb %1, %0" : "=a" (result) : "Nd" (portnumber));
    return result;
}




Port8BitSlow::Port8BitSlow(uint16_t portnumber)
: Port8Bit(portnumber)
{
}

Port8BitSlow::~Port8BitSlow()
{
}

void Port8BitSlow::Write(uint8_t data)
{
   __asm__ volatile("outb %0, %1\njmp 1f\n1: jmp 1f\n1:" : : "a" (data), "Nd" (portnumber));
}





Port16Bit::Port16Bit(uint16_t portnumber)
: Port(portnumber)
{
}

Port16Bit::~Port16Bit()
{
}

void Port16Bit::Write(uint16_t data)
{
   __asm__ volatile("outw %0, %1" : : "a" (data), "Nd" (portnumber));
}

uint16_t Port16Bit::Read()
{
      uint16_t result;
    __asm__ volatile("inw %1, %0" : "=a" (result) : "Nd" (portnumber));
    return result;
}



Port32Bit::Port32Bit(uint16_t portnumber)
: Port(portnumber)
{
}

Port32Bit::~Port32Bit()
{
}

void Port32Bit::Write(uint32_t data)
{
   __asm__ volatile("outl %0, %1" : : "a" (data), "Nd" (portnumber));
}

uint32_t Port32Bit::Read()
{
      uint16_t result;
    __asm__ volatile("inl %1, %0" : "=a" (result) : "Nd" (portnumber));
    return result;
}
Port.h Source Code:

Code: Select all

#ifndef __PORT_H
#define __PORT_H


#include "types.h"



    class Port
    {
    protected:
        uint16_t portnumber;
        Port(uint16_t portnumber);
	~Port();
    };
    
    
    class Port8Bit : public Port
    {
    public:
        Port8Bit(uint16_t portnumber);
	~Port8Bit();
	virtual void Write(uint8_t data);
	virtual uint8_t Read();
    };
    
    
     class Port8BitSlow : public Port8Bit
    {
    public:
        Port8BitSlow(uint16_t portnumber);
	~Port8BitSlow();
	virtual void Write(uint8_t data);
    };
    
    
    
      class Port16Bit : public Port
    {
    public:
        Port16Bit(uint16_t portnumber);
	~Port16Bit();
	virtual void Write(uint16_t data);
	virtual uint16_t Read();
    };
    
    
      class Port32Bit : public Port
    {
    public:
        Port32Bit(uint16_t portnumber);
	~Port32Bit();
	virtual void Write(uint32_t data);
	virtual uint32_t Read();
    };
    
    
#endif

Re: C++ Undefined Reference to .rodata._ZTI9Port32Bit[_ZT) E

Posted: Thu Apr 28, 2022 8:38 pm
by thepowersgang
Your linker script isn't including all `.rodata.*` sections

A common pattern is to use the line `*(.rodata .rodata.*)` to import them (and use the same pattern for all other sections)

Re: C++ Undefined Reference to .rodata._ZTI9Port32Bit[_ZT) E

Posted: Fri Apr 29, 2022 8:35 am
by Mehmetdev1
I Got The Problem Now How Should I Write a Code?