2011-01-31 8 views
2

나는 프로그래머가 아니며 아마 내 머리 위로 박쥐를 잡을 것입니다.C/C++ 프로그램에서 __strlen_sse2를 호출하려면 어떻게해야합니까? [Linux]

libc6-i686의 일부로 데비안에 설치된 __strlen_sse2 (어셈블리) 함수의 버그를 추적하려고합니다.

이미 어셈블리 코드 (.S 파일) 사본이 있으며 C/C++ 프로그램에서 호출하는 방법을 찾아야합니다. 이것을 어떻게 할 수 있습니까?

편집 :

이 코드를 시도,하지만 난 '__strlen_sse2'

편집 2에 정의되지 않은 참조에 대한 GCC에서 오류가 발생합니다 :이 질문에 적절한 대답은 나의 이해,하지만 그것을 완성하기 위해 적절한 지식이 부족합니다. 모두 도움을 주셔서 감사합니다.

#include <stdio.h> 
#include <string.h> 

size_t __strlen_sse2(const char *); 

void main() 
{ 
    char buffer[255]; 

    printf("Standby.. "); 
    gets(buffer); 
    __strlen_sse2("CRASH!"); 
    printf("OK!\n"); 
} 

내가 말했듯이 ... 프로그래머가 아닙니다.

제 질문에 도움이 되었기를 바랍니다. 더 자세한 정보가 필요하면 알려주십시오.

답변

2

동적으로 연결된 일반적인 /lib/libc.so.6 안에는 __strlen_sse2의 복사본을 직접 호출 할 수 없습니다.이 코드는 "숨겨진 심볼"이므로 libc 자체의 코드에서는 액세스 할 수 있지만 외부 연결에서는 사용할 수 없습니다.

glibc의 소스 코드에서 __strlen_sse2을 정의하는 파일이 있다고 생각하지만 glibc 외부에서 빌드 가능하도록 수정해야합니다. 내가 옳은 파일이라고 생각하는 것을 발견하고 그것을 꽤 쉽게 수정할 수있었습니다. 단지

 .text 

을 읽어 줄을 포함하지 최대하지만 모든 것을 삭제하고이로 교체 :

#define PUSH(REG)  pushl REG 
#define POP(REG)  popl REG 
#define PARMS   4 
#define STR    PARMS 
#define ENTRANCE 
#define RETURN   ret 
#define L(x)   .L##x 
#define ENTRY(x)  .globl x; .type x,@function; x: 
#define END(x)   .size x, .-x 

는 또한 파일의 맨 끝에 #endif 라인을 삭제합니다. 다음과 같이 컴파일 :

gcc -m32 -c strlen-sse2.S 
gcc -m32 -c test.c 
gcc -m32 test.o strlen-sse2.o 
./a.out 

당신은 -m32의 필요하지 않을 수 있습니다.

superuser.com에서 큰 문제에 대한 도움을 얻을 수 있습니다 - 질문에 /proc/cpuinfo의 내용을 제공하십시오.

+0

와우, 멋진 답변. 내가 한 일을 성취 할 수있는 구체적인 단계에 대해 너무 고마워. 아아, 내 큰 문제는이 특정 기능과 관련이없는 것처럼 보입니다. 적어도 나는 그것을 배제 할 수있었습니다. 다시 한번 감사드립니다. –

1

전체 프로토 타입으로 함수를 선언하고 호출하십시오. 나는 당신이이 기능의 버그를 추적하려는 청구의 조금 회의적

size_t __strlen_sse2(const char *); 

: 이것은 아마도 올바른 프로토 타입입니다. 프로그램에 잘못된 인수 (유효하지 않은 포인터 또는 null로 끝나는 문자열 이외의 포인터)가있는 strlen을 호출하는 버그가있을 가능성이 큽니다.

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 시도하고 다시보고 할 것이다. 충돌하는 프로그램은 실제로 init과 bash입니다. 복잡한 상황이지만 문제가 무엇이든 libc 내부에서 발생하고 재현 가능하다는 것을 확인하기 만하면됩니다 (적어도 내 시스템에서는). 그렇게하면 적절한 버그 보고서를 만들 수 있습니다. –

+0

코드를 사용해 보았지만 컴파일러가 함수에 대한 정의되지 않은 참조에 대해 불평했습니다. 제발 저를 참아주십시오, 이것은 제게 새로운 영역입니다. –

+0

불평하는 컴파일러 또는 링커였습니까? 이것이 링커라면'__strlen_sse2'를 포함하는 파일에 링크하지 않았기 때문일 것입니다. –

관련 문제