PDA-версия форума ASUSMobile.RU

Поиск - Профиль - Войти и проверить личные сообщения - Вход - Регистрация
Форум Asus Mobile Club Russia > Полезное > Раздел Разработчика и Программиста > Таблица релоков в модуле

На страницу 1, 2, 3, 4  След.
[Ответить на тему]

Yad [31.08.09, 17:24] Таблица релоков в модуле:
Уважаемые, а никто не знает, где в модуле хранится таблица релоков? Насколько я понял, это секция с флагом 42000042, либо 42002042, вот только она там не в явном виде, судя по 2ке в пятой позиции возможно секция сжата, кто-нить знает метод сжатия?

Тему прилепил. //Barin

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 10:31] :
Привет. Barin, если это не секрет, каким образом в OSBuilder решается проблема bit 5 при релоке XIP'а?

(тут были ошибочные мнения о "ненужности" NUL-дырок в XIP'е, не проверил как следует, сорри).

PS: recmod изучил, он "бит 5" тоже не понимает.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 11:16] :
Skydance
Пока секрет icon_smile

Насчёт "ненужности" дырок (если Вы имеете в виду дырки между объектами в физическом пространстве XIP'а) - это неизбежное следствие того, что некоторые определённые объекты должны располагаться по адресу кратному 0x1000. Вот идут один за другим 2 таких объекта, а размер их не кратен 0х1000. Вот и получается дыра.

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 12:12] :
Barin писал(а):
Skydance
Пока секрет icon_smile

Насчёт "ненужности" дырок (если Вы имеете в виду дырки между объектами в физическом пространстве XIP'а) - это неизбежное следствие того, что некоторые определённые объекты должны располагаться по адресу кратному 0x1000. Вот идут один за другим 2 таких объекта, а размер их не кратен 0х1000. Вот и получается дыра.


Меняю секрет на находку. Просто лень внимательно вкуривать ROMIMAGE/module.cpp, там ответ на этот "бит 5" есть.

Некоторые "дырки" больше 0х1000 размером. И их можно некоторым читерством сократить до размеров меньше 0х1000 icon_smile Сейчас проверяю, насколько оно безглючно работает.

И еще. Про релок-и модулей из physfirst/physlast. Все тот же hd.dll, у него 3 секции, в которые попалают fixup'ы. Если смотреть на rva этих секций, они, соответственно, 0x1000, 0x3000 и снова 0х3000. При этом fixup'ы идут со смещениями 0х1000, 0х3000 и 0х4000, в итоге, последняя пачка fixup'ов попадает как бы "в никуда". Эту проблему вы как решали, пересчетом rva по vsize? Я пока так сделал, но не уверен, что это корректный подход.

Добавлено спустя 5 минут 52 секунды:

Мда, натурально битая информация в hd.dll лежит.

Вот его секции:

Код:

   e32_vbase:           P+000A8000

   o32[0].o32_vsize:      0000195D
   o32[0].o32_rva:        00001000
   o32[0].o32_psize:      00001960
   o32[0].o32_dataptr:  P+000A9000
   o32[0].o32_realaddr: P+000A9000
   o32[0].o32_flags:      60000020

   o32[1].o32_vsize:      00000954
   o32[1].o32_rva:        00003000
   o32[1].o32_psize:      00000600
   o32[1].o32_dataptr:  P+000C88F4
   o32[1].o32_realaddr: R=804DC000
   o32[1].o32_flags:      C0000040

   o32[2].o32_vsize:      000000A0
   o32[2].o32_rva:        00003000
   o32[2].o32_psize:      000000A0
   o32[2].o32_dataptr:  P+000AB000
   o32[2].o32_realaddr: P+000AB000
   o32[2].o32_flags:      40000040


А вот смещения fixup'ов:
Код:

0x10cc
0x1144
...
0x3004
0x4000     !!!
0x4008     !!!

То, что с восклицательными знаками, вообще, по идее, не попадает ни в какую секцию. Но я вижу, что все релоки меняют третью, ту, у которой и rva, и dataptr показывают на 0х3000 смещение. Кроме как расчетом по vsize с предположением что секции идут одна за другой не могу объяснить.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 12:33] :
Skydance писал(а):
Некоторые "дырки" больше 0х1000 размером

Если Вы про секции модулей K, то да, возможно, только вот во всех заводских XIP'ах эти дырки не заполняются, наверное неспроста icon_smile

Добавлено спустя 10 минут 46 секунд:

Skydance писал(а):
Кроме как расчетом по vsize с предположением что секции идут одна за другой не могу объяснить.

Я пробовал вычислять адрес по vsize секций, но в этом случае приключались гиморы с другими модулями, так что пока, если по фиксапу не находится соответствие секции (по rva), я такой фиксап просто отбрасываю. Может это и неправильно, но пока никаких прецедентов не было.

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 12:50] :
Barin писал(а):
Если Вы про секции модулей K, то да, возможно, только вот во всех заводских XIP'ах эти дырки не заполняются, наверное неспроста icon_smile

Я пробовал вычислять адрес по vsize секций, но в этом случае приключались гиморы с другими модулями, так что пока, если по фиксапу не находится соответствие секции (по rva), я такой фиксап просто отбрасываю. Может это и неправильно, но пока никаких прецедентов не было.


Да, я про те самые дырки. Я все-таки попробую их аккуратно заполнить, как следует протестирую, и там посмотрю уже.

Про отбрасываение фиксапов - тогда, выходит, EXTReloc от соседнего товарища работает корректнее. На примере все того же hd.dll из фирменной прошивки 1.66 для HD2, у него 20 штук фиксапов "за границами" модулей по rva. Однако ж, EXTReloc, судя по изменениям в секции pdata, их обрабатывает. Как - не знаю, но предположу, что смотрит на page rva в заголовке каждого reloc-блока.

Ну или, как вариант, секция pdata (это [EXC]) обрабатывается отдельно.

Добавлено спустя 2 минуты 47 секунд:

Кстати, а вообще вы как-нибудь обрабатываете пересечение rva секций внутри physfirst/physlast? Я про все тот же hd.dll, у которого секции [1] и [2] обе стартуют с 0x3000, имеют ненулевой vsize/psize.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 12:56] :
Skydance
На вкус и цвет все фломастеры разные, но при этом возникает вопрос, а работают ли при этом (используются ли реально hd, osa, kd и иже с ними, если остаются в XIP'е).

Добавлено спустя 3 минуты 8 секунд:

Skydance писал(а):
а вообще вы как-нибудь обрабатываете пересечение rva секций внутри physfirst/physlast

С чего бы им пересекаться, если у них realaddr разные. Одна сидит в физ. пространстве, а другая (RW) копируется в RAM.

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 13:03] :
Barin писал(а):

С чего бы им пересекаться, если у них realaddr разные. Одна сидит в физ. пространстве, а другая (RW) копируется в RAM.

Зато rva одинаковые, 0х3000 и 0х3000 icon_smile
Если обрабатывать fixup'ы по rva, то таки надо думать о пересечениях оных. Потому как неясно, контент какой секции релочить.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 13:08] :
Skydance
Давайте подойдём к этому не с теоретической, а с практической точки зрения. У вас hd используется? (именно ИСПОЛЬЗУЕТСЯ, а не просто присутствует?)

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 13:20] :
Barin писал(а):
Skydance
Давайте подойдём к этому не с теоретической, а с практической точки зрения. У вас hd используется? (именно ИСПОЛЬЗУЕТСЯ, а не просто присутствует?)

Да, вместе с osaxst0/1.dll Rake кое-что из них дергают qualcomm debug tools.

В общем, сбацал рекалькулятор rva для kernel-модулей, вроде бы фурычит. Теперь буду пытаться "дырдочки" между vbase и реальным стартом кода изучать на предмет полезности. Пока у меня есть рабочий XIP с уменьшенными дырочками (но выигрыш смешной, всего 2 страницы, суть 8 кб), а вот дальше дело не пошло...

Добавлено спустя 1 минуту 13 секунд:

Ну и кроме того, чисто спортивный интерес - ведь EXTReloc же обрабатывает как-то те fixup'ы, которые как бы за rva секции сидят.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 13:28] :
Skydance писал(а):
В общем, сбацал рекалькулятор rva для kernel-модулей, вроде бы фурычит

то есть для kernel модулей вычисляете RVA по VSIZE с округлением в страницу?

Skydance писал(а):
есть рабочий XIP с уменьшенными дырочками (но выигрыш смешной, всего 2 страницы, суть 8 кб)

не скажите, если физ. пространство маленькое и physlast (RamStart) двигать нельзя, то и это хлеб icon_smile

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 13:32] :
Barin писал(а):
то есть для kernel модулей вычисляете RVA по VSIZE с округлением в страницу?

Ага, при условии, что realaddr лежит внутри physfirst/physlast.
Таких модулей у HD2 ровно три, nk.exe, hd.dll, osaxst0.dll.

Barin писал(а):

не скажите, если физ. пространство маленькое и physlast (RamStart) двигать нельзя, то и это хлеб icon_smile

Дык ить, потому и занимаюсь этим крохоборством. Если получится - сообщу, и вывалю XIP рабочий.

В обмен на "тайну пятого бита" Very Happy

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 13:37] :
Skydance писал(а):
Таких модулей у HD2 ровно три, nk.exe, hd.dll, osaxst0.dll

Их бывает ещё больше (на других девайсах). Можно Ваш НЕРЕЛОЧЕННЫЙ hd.dll и V и R, по которым Вы его отрелочили?

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 13:59] :
Пожалуйста.
Это нерелоченный hd.dll.
Сейчас его vbase = P + 0x99000, и, очевидно, ровно такой же R.
Мне надо его сдвинуть на 0х1000 дальше, чтобы V = 0x9A000, т.к. мой nk.exe длиннее.

EXTReloc его вроде бы корректно релочит...

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 14:01] :
Skydance
R оставляем = 0x804C4000 ?

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 14:50] :
Да.

Но какая разница-то, это никак не влияет на то, что fixup'ы, если их делать по rva секций, не все проходят.
20 штук тех, у которых rva от 0х4000 стартуют, оказываются непримененными, т.к. у модуля вообще нет секции с rva 0x4000.

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 15:12] :
Skydance
Сравнивайте...

V=800A0000
R=804C4000

[spoiler:7a605b0ce7=fixups]
Код:
000010CC   S000   000000CC   804C4920   S001
00001144   S000   00000144   804C4920   S001
000011D4   S000   000001D4   804C4004   S001
000011D8   S000   000001D8   804C4920   S001
00001268   S000   00000268   804C4004   S001
0000126C   S000   0000026C   804C4920   S001
00001364   S000   00000364   804C4940   S001
00001368   S000   00000368   804C4004   S001
0000136C   S000   0000036C   804C4920   S001
00001370   S000   00000370   804C4470   S001
000013D8   S000   000003D8   804C4920   S001
0000166C   S000   0000066C   800A103C   S000
00001670   S000   00000670   800A1374   S000
00001674   S000   00000674   800A10D0   S000
00001778   S000   00000778   804C4940   S001
0000177C   S000   0000077C   804C4000   S001
00001780   S000   00000780   804C4920   S001
00001784   S000   00000784   804C4470   S001
00001868   S000   00000868   800A1678   S000
0000186C   S000   0000086C   800A1270   S000
00001870   S000   00000870   800A1148   S000
00001874   S000   00000874   804C48E0   S001
00001878   S000   00000878   800A1630   S000
0000187C   S000   0000087C   800A1288   S000
00001884   S000   00000884   804C4004   S001
00001888   S000   00000888   804C4924   S001
0000188C   S000   0000088C   804C4940   S001
00001890   S000   00000890   804C4464   S001
00001900   S000   00000900   800A1788   S000
00001984   S000   00000984   804C48E0   S001
00001988   S000   00000988   804C4478   S001
000019E8   S000   000009E8   804C48E0   S001
000019EC   S000   000009EC   804C4478   S001
00001A44   S000   00000A44   804C48E0   S001
00001A48   S000   00000A48   804C4478   S001
00001AA0   S000   00000AA0   804C48E0   S001
00001AA4   S000   00000AA4   804C4478   S001
00003004   S001   00000004   804C4474   S001
00004000   S002   00000000   800A103C   S000
00004008   S002   00000008   800A10D0   S000
00004010   S002   00000010   800A1148   S000
00004018   S002   00000018   800A11DC   S000
00004020   S002   00000020   800A1270   S000
00004028   S002   00000028   800A1288   S000
00004030   S002   00000030   800A1374   S000
00004038   S002   00000038   800A13DC   S000
00004040   S002   00000040   800A14B8   S000
00004048   S002   00000048   800A1630   S000
00004050   S002   00000050   800A1678   S000
00004058   S002   00000058   800A1788   S000
00004060   S002   00000060   800A1894   S000
00004068   S002   00000068   800A1904   S000
00004070   S002   00000070   800A198C   S000
00004078   S002   00000078   800A19F0   S000
00004080   S002   00000080   800A1A4C   S000
00004088   S002   00000088   800A1AA8   S000
00004090   S002   00000090   800A1B98   S000
00004098   S002   00000098   800A1F44   S000
[/spoiler:7a605b0ce7]

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 16:22] :
Колонки что означают? первая - offset fixup'а, а дальше?

[Ответить на тему]   Ответить с цитатой   
Barin [21.04.10, 16:26] :
2-секция
3-смещение от начала секции
4-адрес, содержащийся по смещению
5-к какой секции он относится (это для вычисления дельты при изменении realaddr секции)

[Ответить на тему]   Ответить с цитатой   
Skydance [21.04.10, 17:01] :
Barin писал(а):
2-секция
3-смещение от начала секции

Во, вот я именно про колонки 2 и 3. Как вы вычисляете, в какую секцию попадает fixup? Если вы делаете это по rva секции, то по идее ничего не должно получаться, т.к. у hd.dll нет ни одной секции с rva = 0x4000, а fixup'ы туда есть.

[Ответить на тему]   Ответить с цитатой   

[Ответить на тему]

На страницу 1, 2, 3, 4  След.
Форум Asus Mobile Club Russia > Полезное > Раздел Разработчика и Программиста > Таблица релоков в модуле