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

 
 
 
Reply to this topicStart new topic
> Исключение неиспользуемых функций из кода
Harvester
сообщение Oct 3 2007, 10:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Пишу сейчас под dsPIC на C30 и возник следующий вопрос.
Имеется файл, в котором описано несколько функций. При этом несмотря на то, что в программе используется только одна из них, в итоговом hex-файле присутствует код для всех функций. При использовании скомпилированных библиотек такого не происходит. Что здесь можно сделать?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 3 2007, 11:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Harvester @ Oct 3 2007, 13:43) *
При использовании скомпилированных библиотек такого не происходит. Что здесь можно сделать?

Вы уже сами и ответили - использовать библиотеки.
Альтернатива - условная компиляция. Еще одна альтернатива - использовать IAR, у него формат объектников и линкер позволяют выбрасывать неиспользумые куски кода.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Harvester
сообщение Oct 3 2007, 11:07
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(zltigo @ Oct 3 2007, 14:01) *
Вы уже сами и ответили - использовать библиотеки...

Как-то долго и криво получается.
И все равно остается непонятным, в чем принципиальная разница (для toolchain-а) между выбором нужных функций из библиотечного файла и компиляцией файла в объектный с последующей выборкой тех же требуемых функций


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
upc2
сообщение Oct 3 2007, 11:14
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 506
Регистрация: 29-09-05
Из: Донецк
Пользователь №: 9 063



Тщательно продумывать программу и использовать
#if
#else
#endif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 3 2007, 11:22
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Harvester @ Oct 3 2007, 14:07) *
И все равно остается непонятным ....

В традиционных объектных файлах все уже склеено в один комок и информация, как вырезать и переклеить уже отсутствует. Линкер оперирует только внешними связями.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Harvester
сообщение Oct 3 2007, 11:27
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(zltigo @ Oct 3 2007, 14:22) *
В традиционных объектных файлах все уже склеено в один комок и информация, как вырезать и переклеить уже отсутствует. Линкер оперирует только внешними связями.

А бывают "нетрадиционные" объектные файлы?
И почему тогда при компиляции программы для ПК, скажем в C Buildere, в исполняемый файл включаются только используемые функции?


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 3 2007, 11:57
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Harvester @ Oct 3 2007, 14:27) *
А бывают "нетрадиционные" объектные файлы?

Читайте ответы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
George!
сообщение Oct 4 2007, 01:36
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 28
Регистрация: 19-03-05
Из: Омск
Пользователь №: 3 489



Цитата
И все равно остается непонятным, в чем принципиальная разница (для toolchain-а) между выбором нужных функций из библиотечного файла и компиляцией файла в объектный с последующей выборкой тех же требуемых функций

Если посмотреть внимательно то можно заметить, что каждая библиотечная функция в стандартной библиотеке написана в отдельном файле. Это означает что у каждой функции свой объектный файл. Множество таких объектников объеденены в библиотеку.
Во время линковки, линковщик ищет среди всех библиотек и по всем объектным файлам содержащихся в них на предмет какой-нибудь переменной или функции, и нужный объектник прикрепляет к проекту.
Вот поэтому, стандартные библиотеки не добавляют лишних функций. Линковщик добавил, например, объектник с функцией memcpy. А в этом объектнике ничего кроме memcpy и нет. Если в файле объявлено несколько функций, в код добавятся все.
Наколько знаю, все функции объявленные в файле, который прикреплен к проекту, попадут в конечный код. Это связано с тем, что в командную строку линковщика они попадают как объектники.
Например: link main.o leds.o ADC.o RTC.o
В таком случае линковщик не думает, нужно ли это или нет, а просто добавляет в конечный код.
Go to the top of the page
 
+Quote Post
d__
сообщение Oct 4 2007, 08:56
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Эта функциональность хорошо развита в IAR. Там любой оттранслированный сишный файл представляет из себя как-бы библиотеку и линковщик не линкует функции, которые никем не вызываются. И чтобы неиспользуемая функция(переменная) осталась в выходном файле после линковки, ей необходимо присвоить аттрибут required...
Go to the top of the page
 
+Quote Post

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

 


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


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