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

 
 
> Проблемы при компиляции и компоновке
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 16 2008, 06:10
Сообщение #2


Участник
*

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


Гуру
******

Группа: Модераторы
Сообщений: 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 Текстовая версия Сейчас: 29th July 2025 - 15:29
Рейтинг@Mail.ru


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