Как сравнить два одинаковых вывода сборки g ++ -S? - PullRequest
0 голосов
/ 04 февраля 2009

diff терпит неудачу, так как список сборки заполнен немного другими метками.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2009

Вместо непосредственного сравнения списков сборок, создаваемых параметром -S, вы можете вместо этого скомпилировать до объектных файлов, разобрать объектные файлы и затем сравнить их. (Или, вы могли бы просто сделать прямой diff из hexdump скомпилированного объектного кода, но это намного более болезненно). Это избавляет от большинства меток, поэтому его легче сравнивать с diff. Например:

g++ file1.cc -c -o file1.o
g++ file2.cc -c -o file2.o
objdump -d file1.o > file1.s
objdump -d file2.o > file2.s
diff file1.s file2.s
0 голосов
/ 04 февраля 2009

Вы можете вырезать метки с помощью простого sed и заменить их на «label» или с пробелами (и использовать «diff -w»).

Это не будет учитывать места, где использовались разные регистры, но операции одинаковы. Это может быть довольно распространенным явлением, добавление переменной в функцию может привести к перераспределению регистров по всему коду в местах, не связанных напрямую.

Единственный способ справиться с этим - написать программу, специально предназначенную для поиска и обработки этих случаев. Я не думаю, что вы найдете какое-либо «простое» решение, которое будет работать при любых условиях.

...