2013-02-26 1 views
0

공유 라이브러리를 생성하는 makefile이 있습니다. 다른 쉘 (VxWorks wrenv 및 Cygwin)에서 make를 호출하면 다른 libs가 생성됩니다. Thy VxWorks 버전이 Cygwin 버전을 사용하고 있지 않습니다. 차이는 매우 작으며 readelf 프로그램으로는 보이지 않습니다.링커에서 다른 코드 (objdump)를 생성합니다.

objdumparm -S *.so을 사용하면 기능의 끝에서 차이가 나타납니다. 다음 출력을 참조하십시오.

예 1 : (마지막 두 라인이 다를)

시그윈 :

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 : (마지막 라인이 다르다)

시그윈 :

,357,583,210

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 

파라미터는 동일하다. 이러한 차이점은 재배치 과정에서 발생합니까?

왜 이런 일이 일어나는 이유는 무엇입니까?

+0

컴파일러의 매개 변수는 무엇입니까? 그리고 btw. 어떤 건축인가? 어쩌면 두 쉘이 다른 모드에서 실행 중일 수 있습니다. 그러면 컴파일러가 어떻게 든이 모드를 상속합니까? (64/32 비트, 팔 엄지 등) – PlasmaHH

답변

0

흠, 링커는 나쁜 사람이 아니 었습니다! 컴파일러가 다른 .sho 개체를 생성하고 있음을 알았습니다. -fno-builtin 옵션을 사용하여 .sho 파일을 컴파일하면 차이가 제거됩니다 ...