2016-11-16 2 views
0

Я пытаюсь получить адрес инструкции, отмеченной меткой в ​​сборке ARM, относительно ее раздела без перезаписи ассемблера. Например:Получение раздела и адреса метки относительно его раздела статически (не во время выполнения)

.text 
nop   # 0 
mov r1, r2 # 4 
loop: 
mov r0, #170 # 8 

Если я хочу адрес loop тогда я получаю 8, потому что каждая команда здесь имеет длину 4 байта и начинается после двух команд.

Я должен уточнить, я не ищу ldr r0, =loop, я ищу команду, как GCC, который я накормить .s файл и получить что-то вроде

loop=.text+0x0000ad4e 
abc=.data+0x0000007a 

Заранее спасибо!

+0

Вы пробовали 'objdump -t'? – fuz

+1

Или даже команда 'nm'? – fuz

+0

@FUZxxl Команда 'nm' - это именно то, что мне нужно, спасибо! Вы можете преобразовать его в ответ. – Wazzaps

ответ

4

Используйте либо nm или objdump -t команду, чтобы получить интересующую вас информацию в: Перед тем как перемещение происходит, значения символов, выводимые nm являются относительно сегмента, начиная, как вы хотели.

Результат выглядит следующим образом:

$ nm moves.o 
00000000 T attack_map 
00000280 T generate_moves 
00000160 T gote_in_check 
     U moves_for 
00000320 T play_move 
00000110 T sente_in_check 
000001b0 T turn_board 
00000000 r turn_board.turned_board 

и objdump -t:

$ objdump -t moves.o 

moves.o:  file format elf32-i386-freebsd 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 moves.c 
00000000 l  O .rodata 0000001d turn_board.turned_board 
00000000 l d .rodata 00000000 .rodata 
00000000 g  F .text 00000106 attack_map 
00000280 g  F .text 00000099 generate_moves 
00000160 g  F .text 00000047 gote_in_check 
00000000   *UND* 00000000 moves_for 
00000320 g  F .text 00000169 play_move 
00000110 g  F .text 0000004a sente_in_check 
000001b0 g  F .text 000000c7 turn_board