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

 
 
 
Reply to this topicStart new topic
> Проблемы при компиляции и компоновке
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
Сергей Борщ
сообщение Jul 14 2008, 14:02
Сообщение #2


Гуру
******

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



Цитата(NikAn @ Jul 14 2008, 16:35) *
objcopy делает из него бинарный файл размером 1ГБ (~1КБ эффективного кода + куча нулей).
Посмотрите в .map, в какую входную секцию попадает ваш объект. И в скрипте линкера - в какую выходную секцию линкуется эта входная и как объявлена выходная секция.
Цитата(NikAn @ Jul 14 2008, 16:35) *
main.cpp:46: undefined reference to `_Unwind_SjLj_Register'
Рискну предположить, что это код поддержки исключений или RTTI и для него надо подключать какую-то другую libc. Попробуйте отключить исключения и RTTI: CPP_FLAGS += -fno-exceptions -fno-rtti


--------------------
На любой вопрос даю любой ответ
"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
NikAn
сообщение Jul 15 2008, 13:21
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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, 16:14
Сообщение #4


Гуру
******

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



Цитата(NikAn @ Jul 15 2008, 16:21) *
Извините, не понял. Вот фрагмент main.map
Это я неточно выразился. Попробуйте arm-elg-objdump -h -S -C file.elf > file.lss Файл .lss будет начинаться с перечня выходных секций и их флагов, примерно такого:
Код
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000092c  00200000  00200000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .bss:         000002e0  0020092c  0020092c  0000892c  2**2
                  ALLOC
  2 .stack        00000400  00200c0c  00200c0c  0000892c  2**0
                  ALLOC
  3 .comment      0000005a  00000000  00000000  0000892c  2**0
                  CONTENTS, READONLY
покажите его (естественно, для файла с объектом Chip), будем думать дальше.


--------------------
На любой вопрос даю любой ответ
"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
Сергей Борщ
сообщение Jul 15 2008, 19:49
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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
NikAn
сообщение Jul 16 2008, 06:10
Сообщение #6


Участник
*

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



Большее спасибо! a14.gif

Проблема разрешилась. Однако суть происходящего мне не очень ясна.

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


Я правильно понимаю, что эта одноименная секция в выходном elf файле как-то неправильно описана (размер или конец не помечен), и поэтому objcopy выдает кривой bin файл?

А есть какой-нибудь хороший-хороший мануал по работе линкера?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 16 2008, 14:21
Сообщение #7


Гуру
******

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



Начну с конца
Цитата(NikAn @ Jul 16 2008, 09:10) *
А есть какой-нибудь хороший-хороший мануал по работе линкера?
Собственно, на сайте binutils описание ld. Там особое внимание уделить описанию скриптов.
Цитата(NikAn @ Jul 16 2008, 09:10) *
Я правильно понимаю, что эта одноименная секция в выходном elf файле как-то неправильно описана (размер или конец не помечен), и поэтому objcopy выдает кривой bin файл?
Нет.
Цитата
If you do not use a SECTIONS command in your linker script, the linker will place each input section into an identically named output section in the order that the sections are first encountered in the input files
В вашем случае, линкер встретил секцию ctors и положил ее следом за последней уложенной секцией, т.е. за .bss. При этом секция содержала флаги CONTENTS, ALLOC, LOAD, READONLY, CODE. А когда формировался bin-файл, objcopy вынуждена была чем-то заполнить пустое место между концом text и началом ctors. Если бы вы сформировали .hex вместо .bin, то увидели бы, что в файле есть участок кода с 0000000 по какой-то адрес и потом еще один участок с 0x40000...


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 21st July 2025 - 13:47
Рейтинг@Mail.ru


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