Как я могу получить доступ к размеру символа, как установлено директивой .size в C - PullRequest
0 голосов
/ 08 января 2019

Я установил размер символа в сборке, используя директиву .size ассемблера GNU, как мне получить доступ к этому размеру в C?

void my_func(void){}

asm(
    "_my_stub:\n\t"
    "call my_func\n\t"
    ".size _my_stub, .-_my_stub"
);

extern char* _my_stub;

int main(){
    /* print size of _my_stub here */
}

Здесь уместен objdump

0000000000000007 <_my_stub>:
_my_stub():
   7:   e8 00 00 00 00          callq  c <main>

Вот соответствующая часть readelf

Symbol table '.symtab' contains 14 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     5: 0000000000000007     5 NOTYPE  LOCAL  DEFAULT    1 _my_stub

Из таблицы objdump и символов видно, что размер _my_stub равен 5. Как я могу получить это значение в C?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я не знаю, как получить доступ к атрибуту размера изнутри газа. Как альтернатива, как насчет замены .size на

hhh:
.long .-_my_stub     # 32-bit integer constant, regardless of the size of a C long

и

extern const uint32_t gfoo asm("hhh");
 // asm("asm_name") sidesteps the _name vs. name issue across OSes

Я не могу попробовать это здесь, но я ожидаю, что вы сможете printf("%ld\n", gfoo);. Я попытался использовать .equ, так что это было бы константой, а не выделением памяти для него, но я так и не получил ее правильную работу.

Это оставляет вопрос относительно цели атрибута .size. Зачем устанавливать это, если вы не можете прочитать это? Я не эксперт, но у меня есть теория:

Согласно документам , для выходов COFF .size должно быть в пределах .def/.endef. Глядя на .def , мы видим, что он используется для Начать определение информации отладки для имени символа .

Хотя у ELF нет такого же требования к вложенности, кажется правдоподобным предположить, что отладка - это тоже цель. Если это предназначено только для использования отладчиками, то (вроде) имеет смысл, что нет никакого доступа к нему из ассемблера.

0 голосов
/ 08 января 2019

Полагаю, вы просто хотите получить размер подмножества сегмента кода или сегмента данных. Вот пример сборки (стиль GAS & AT), к которому вы можете обратиться:

target_start:
// Put your code segment or data segment here
// ...
target_end = .

// Use .global to export the label
.global target_size
target_size = target_end - target_start

В исходном файле C / C ++ вы можете использовать метку target_size от extern long target_size.

Примечание: этот пример не был проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...