реклама на сайте
подробности

 
 
> Проблемы при компиляции и компоновке
NikAn
сообщение Jul 14 2008, 13:35
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 24-06-08
Пользователь №: 38 525



Добрый день (вечер/ночь/утро)!

Пишу на С++.

Проблема первая: Если обьект, определенного мной типа, расположить вне main (т.е. он будет глобальным), компоновщик генерирует странный elf файл. Странность его в том, что утилита arm-elf-objcopy делает из него бинарный файл размером 1ГБ (~1КБ эффективного кода + куча нулей).


Проблема вторая: Имеется такой код
int main(void)
{
CHIP Chip;

SINGLE_PORT X13_20;
// X13_20.Init(0, OUTPUT, PULL_UP);
// X13_20.NewConnect(&Chip, P0, 4);

/*.........................*/
}

Если раскоментировать методы обьекта X13_20, компоновщик arm-elf-ld вываливает следующие сообщения:
main.cpp:46: undefined reference to `_Unwind_SjLj_Register'
main.cpp:67: undefined reference to `_Unwind_SjLj_Resume'
main.cpp:67: undefined reference to `__gxx_personality_sj0'
строки 46 и 67 соответственно начало и конец main

Подскажите, чтобы это могло означать

Заранее благодарен

Косяк видимо связан с явными деструкторами (см. http://electronix.ru/forum/index.php?showtopic=49880)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
NikAn
сообщение Jul 15 2008, 13:21
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 24-06-08
Пользователь №: 38 525



Спасибо. Флаги -fno-exceptions -fno-rtti помогли.

Цитата
Посмотрите в .map, в какую входную секцию попадает ваш объект. И в скрипте линкера - в какую выходную секцию линкуется эта входная и как объявлена выходная секция.


Извините, не понял. Вот фрагмент main.map
.bss 0x40000004 0x154
*(.bss)
.bss 0x40000004 0x0 strup.o
.bss 0x40000004 0x0 std_def.o
.bss 0x40000004 0x0 ChipResource.o
.bss 0x40000004 0x0 SinglePort.o
.bss 0x40000004 0x154 main.o
0x40000008 InputBuf
0x40000144 Chip
0x40000138 OutputBufTail
0x4000010c InputBufTail
0x40000140 flag
0x40000004 TIMER0_IntFunc
и т.д.
Глобальный объект Chip вызывает описанный выше косяк

А вот скрипт линкера:
MEMORY
{
rom (rx) : ORIGIN = 0x00000000, LENGTH = 512K
ram (rw) : ORIGIN = 0x40000000, LENGTH = 64K
}
SECTIONS
{
.text :
{
*(.text)
} >rom
.data :
{
*(.data)
} >ram
.bss :
{
*(.bss)
}
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 15 2008, 19:49
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(NikAn @ Jul 15 2008, 16:21) *
А вот скрипт линкера:

Жаль нету смайлика "бъет себя по лбу со словами 'Семен Семеныч!' "
При размещении объекта статически вызов его конструктора кладется в секцию *.ctors а деструктора - в *.dtors
Код
    .text :
    {
        *(.text*)

        __ctors_start = .;
        *(.ctors)
        __ctors_end = .;
        __dtors_start = .;
        *(.dtors)
        __dtors_end = .;
        KEEP(SORT(*)(.ctors))
        KEEP(SORT(*)(.dtors))

        *(.rodata*)         /* read-only data (constants) */
    } >rom

Поскольку эта входная секция у вас никуда не кладется, линкер создает для нее одноименную выходную секцию, а размещает ее после последней описанной вами секции, т.е. после .bss


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016