У меня есть make-файл, который генерирует общую библиотеку. Вызов make из разных оболочек (VxWorks wrenv и Cygwin) приводит к разным библиотекам. Твоя версия VxWorks работает, а версия Cygwin — нет. Различия очень малы и не видны с readelf
программа.
С помощью objdumparm -S *.so
показывает разницу в конце функций. Смотрите следующий вывод.
Пример 1: (две последние строки отличаются)
Cygwin:
00010a14 <_ZN3rag3MD511save_digestEPhPKm>:
10a14: e1a0c00d mov ip, sp
10a18: e92dda30 push {r4, r5, r9, fp, ip, lr, pc}
...
10b18: 00000000 andeq r0, r0, r0
10b1c: 3b6e71a1 blcc 1bad1a8 <_stack+0x1b2d1a8>
10b20: 505c3d7f subspl r3, ip, pc, ror sp
VxWorks:
00010a14 <_ZN3rag3MD511save_digestEPhPKm>:
10a14: e1a0c00d mov ip, sp
10a18: e92dda30 push {r4, r5, r9, fp, ip, lr, pc}
...
10b18: 00000000 andeq r0, r0, r0
10b1c: 00000338 andeq r0, r0, r8, lsr r3
10b20: 0000033c andeq r0, r0, ip, lsr r3
или Пример 2: (последняя строка отличается)
Cygwin:
00010b7c <_ZN3rag3MD55beginEv>:
10b7c: e1a0c00d mov ip, sp
10b80: e92dda10 push {r4, r9, fp, ip, lr, pc}
...
10bd4: e89daa10 ldm sp, {r4, r9, fp, sp, pc}
10bd8: 00000000 andeq r0, r0, r0
10bdc: 695c7960 ldmdbvs ip, {r5, r6, r8, fp, ip, sp, lr}^
VxWorks:
00010b7c <_ZN3rag3MD55beginEv>:
10b7c: e1a0c00d mov ip, sp
10b80: e92dda10 push {r4, r9, fp, ip, lr, pc}
...
10bd4: e89daa10 ldm sp, {r4, r9, fp, sp, pc}
10bd8: 00000000 andeq r0, r0, r0
10bdc: 000005ec andeq r0, r0, ip, ror #11
Параметры для компоновщика идентичны. Эти различия происходят от процесса переезда?
Можно ли сказать, почему это происходит, причина?
Хм, линкер не был плохим парнем! Выяснил, что компилятор генерирует разные объекты .sho. С использованием -fno-builtin
возможность скомпилировать .sho’s убрала различия …
Других решений пока нет …