как определить размер объектного кода в Linux, когда размер дает неправильный ответ?

Я хочу точно знать, сколько объектного кода генерируется GCC для каждой из единиц компиляции, но у меня возникла странная проблема, когда команда «size» из binutils не дает правильного результата.

Возьмем файл C, содержащий только эту функцию:

int foo (int a, int b)
{
  return a+b;
}

Мы можем скомпилировать его и проверить размер кода объекта, используя как «size», так и «objdump»:

$ gcc -O foo.c -c
$ size foo.o
   text    data     bss     dec     hex filename
     52       0       0      52      34 foo.o
$ objdump -d foo.o

foo.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <foo>:
   0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
   3:   c3                      retq   

Из вывода objdump видно, что размер кода объекта составляет 4 байта. Однако размер сообщает о 52 байтах, что неверно.

От использования опции «-D» до objdump похоже, что код обработки исключений и, возможно, некоторые другие вещи измеряются «размером» и добавляются к размеру кода, который меня действительно волнует. Кто-нибудь знает относительно простой способ получить размер, чтобы игнорировать эти дополнения?


person John Regehr    schedule 18.03.2013    source источник
comment
Попробуйте перекомпилировать с помощью -fno-exceptions -fno-unwind-tables   -  person Marat Dukhan    schedule 18.03.2013
comment
Марат, к сожалению эти опции не работают, файл .o точно такой же. Это gcc 4.7.2 на x86-64. Я посмотрю вокруг для некоторых дополнительных опций, которые могли бы выполнить эту работу...   -  person John Regehr    schedule 18.03.2013
comment
Ага, вместе эти опции дают нужный результат: -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables   -  person John Regehr    schedule 18.03.2013


Ответы (1)


Обязательно ли придерживаться size? У него много проблем, подобных тем, с которыми вы столкнулись, поэтому я обычно использую этот фрагмент readelf:

OBJ=foo.o
SEC=.text

readelf -SW "$OBJ" \
  | sed 's/^ *\[[0-9 ]*\] *//' \
  | awk '
    /NOBITS/ { next; }
    /^'$SEC'\>/ { sz = strtonum("0x" $5); s += sz; }
    END { print s }'
person yugr    schedule 27.10.2017