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

 
 
> Знатоки Keil подскажите !, Непонятно, но здорово...
okela
сообщение May 8 2005, 16:21
Сообщение #1


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

Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896



На днях столкнулся с непоняткой при работе с uVision2.
Собрал проект, всё работает нормально. Исходник остался только последний.
Сравнивал бинарники двух последних версий , размер кода в которых был одинаков и увидел 3 десятка отличий. Стал разбираться и обнаружил смещение на 1 байт адресов глобальных переменных (причем не всех , а где-то начиная с середины ).
Т.е. была убрана одна переменная типа char. Дальнейшие разбирательства показали , что адреса при линковке назначаются переменным каким-то
непостижимым образом . Они не зависят от порядка объявления переменных ,
и даже не зависят от порядка появления в программе.
Но самое странное, что они зависят от.... имён переменных. wacko.gif

Это что глюки компилятора/линковщика или я чего-то недопонимаю ???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
bialix
сообщение May 8 2005, 19:15
Сообщение #2


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(okela @ May 8 2005, 18:21)
Дальнейшие разбирательства показали , что адреса при линковке назначаются переменным каким-то
непостижимым образом . Они не зависят от порядка объявления переменных ,
и даже не зависят от порядка появления в программе.
Но самое странное, что они зависят от.... имён переменных.  wacko.gif

Это что глюки компилятора/линковщика или я чего-то недопонимаю ???
*


Вы чего-то недопонимаете.

Никто не обещал, что переменные должны лежать в каком-то определенном порядке. Упорядоченно по алфавиту - это я еще могу как-то понять. Если очень хочется, то воспользуйтесь опцией компилятора Keep variables in order - описание эффекта этой опции есть в доке на компилер.


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
Stas
сообщение May 9 2005, 04:54
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 464
Регистрация: 1-10-04
Из: Челябинск
Пользователь №: 751



Переменные обьявленные для передачи параметров в функции он может убирать / добавлять в зависимости от выбранной оптимизации (те использовать регистры или яч. памяти), лучше это наблюдать в *.SRC файле.
Go to the top of the page
 
+Quote Post
okela
сообщение May 10 2005, 09:11
Сообщение #4


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

Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896



Цитата(bialix @ May 8 2005, 22:15)
Никто не обещал, что переменные должны лежать в каком-то определенном порядке. Упорядоченно по алфавиту - это я еще могу как-то понять. Если очень хочется, то воспользуйтесь опцией компилятора Keep variables in order - описание эффекта этой опции есть в доке на компилер.


Ещё маленькое уточнение. Я имел ввиду, что адреса глобальных переменных чень сильно зависят от состава и количества символов в имени .
Т.е. если я в имени переменной даже заменю один символ из верхнего регистра на нижний , она окажется уже совершенно в другом месте памяти.
Go to the top of the page
 
+Quote Post
bialix
сообщение May 10 2005, 14:52
Сообщение #5


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(okela @ May 10 2005, 11:11)
Ещё маленькое уточнение. Я имел ввиду, что адреса глобальных переменных чень сильно зависят от состава и количества символов в имени .
Т.е. если я в имени переменной даже заменю один символ из верхнего регистра на нижний , она окажется уже совершенно в другом месте памяти.
*


Почему это должно так сильно волновать - вот в чем вопрос?


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
bialix
сообщение May 10 2005, 19:51
Сообщение #6


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(okela @ May 10 2005, 11:11)
Ещё маленькое уточнение. Я имел ввиду, что адреса глобальных переменных чень сильно зависят от состава и количества символов в имени .
Т.е. если я в имени переменной даже заменю один символ из верхнего регистра на нижний , она окажется уже совершенно в другом месте памяти.
*


Я думаю объяснение этому факту имеется и оно достаточно простое. Наверняка при линковке кейл держит список всех глобальных переменных в некотором хэш-массиве. Это наиболее удобный и главное быстрый способ для работы с большим набором строковых идентификаторов, имеющих различную длину. Ну а поскольку в хэш-массивах не имеет никакого значения упорядоченность по алфавиту или другие кажущиеся естественными методы упорядочивания данных, то потому и возникает эффект хаотического расположения переменных в памяти, когда даже малейшее изменение имени приводит к значительным различиям в хэшах.

Если рассматривать эту "проблему" под таким углом зрения, то становится понятным почему в кейле введена опция "Keep variables in order": она включает генерацию дополнительной информации для линкера, по которой он может потом восстановить порядок следования данных в исходном коде.


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
okela
сообщение May 12 2005, 09:30
Сообщение #7


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

Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896



Цитата(bialix @ May 10 2005, 22:51)
Цитата(okela @ May 10 2005, 11:11)
Ещё маленькое уточнение. Я имел ввиду, что адреса глобальных переменных чень сильно зависят от состава и количества символов в имени .
Т.е. если я в имени переменной даже заменю один символ из верхнего регистра на нижний , она окажется уже совершенно в другом месте памяти.
*


Я думаю объяснение этому факту имеется и оно достаточно простое. Наверняка при линковке кейл держит список всех глобальных переменных в некотором хэш-массиве. Это наиболее удобный и главное быстрый способ для работы с большим набором строковых идентификаторов, имеющих различную длину. Ну а поскольку в хэш-массивах не имеет никакого значения упорядоченность по алфавиту или другие кажущиеся естественными методы упорядочивания данных, то потому и возникает эффект хаотического расположения переменных в памяти, когда даже малейшее изменение имени приводит к значительным различиям в хэшах.

Если рассматривать эту "проблему" под таким углом зрения, то становится понятным почему в кейле введена опция "Keep variables in order": она включает генерацию дополнительной информации для линкера, по которой он может потом восстановить порядок следования данных в исходном коде.
*




Благодарю за обстоятельное разъяснение !
Похоже что так оно и происходит.. Было просто интересно разобраться.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 20:41
Рейтинг@Mail.ru


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