2012-09-09 1 views
0

용으로 컴파일 크로스, 나는 다음과 같은 일반적인 설정으로 crosstool-NG를 사용하여 내 자신의 툴체인 출시 때 전화 :문제()는 NDK 독립형 툴 체인 및 생체 공학 몇 가지 제한을 바탕으로 안드로이드

  • 의 binutils-2.22 gfortran와
  • GCC-4.5.3을 사용
  • 의 glibc-2.14.1
  • 커널 헤더-2.35.7
  • 아치
arm4t

이것을 사용하여 실행 파일을 빌드하고 libc, ld-linux 등을 비롯한 모든 종속성을 Android 장치에 업로드합니다. 나는 수동으로 ld-linux.so.3 --library-path로 실행 파일을 실행한다 ...

이것은 매우 복잡한 실행 파일이며, system() 호출을 수행하면 모두 작동하는 것처럼 보인다. 시스템 ("pwd") 또는 시스템 (NULL)과 같은 기본 사항은 상태 (찾을 수 없음)로 127이됩니다. 나는 더 나아가 응답을 수집하는 대신는 popen 사용하는 경우, 내가 얻을 :

* 의 glibc *이 감지 더블 무료 또는 손상 무슨 일

? 누구도 비슷한 일에 성공 했습니까? 사용 권한 문제가 있습니까? system() 호출을 불가능하게 만드는 Android와 근본적으로 다른 점이 있습니까? 어떻게 바이오닉이 시스템과 popen (소스 코드)을 처리하는지 알아낼 수 있습니다. 왜냐하면 NDK를 사용하면 system() 호출을 할 수 있다고 생각하기 때문입니다.

+0

언제 glibc 오류가 발생합니까? 'popen' 콜? 아니면 그 후 어떤 전화? –

+1

'/ bin/sh'은 Android에 없습니다. 그것은'/ system/bin/sh' AFAIK에 있습니다. glibc는'/ bin/sh'을 사용합니다. – nneonneo

+0

nneonneo-system() 호출이 glibc에서 처리되는 위치를 알고 있습니까? 특히, 소스 코드에서 어디에? 소스 코드를 수정하는 것 외에는 환경 변수와 같이 보이는 부분을 재정의 할 수있는 더 좋은 방법이 있습니까? – corbin

답변

1

(1) SHELL 환경 변수가 Android에서 설정되지 않을 수 있습니다. 기본 쉘 /bin/sh이 존재하지 않습니다 (AFAIK). /system/bin/sh에 있습니다. 이로 인해 system이 실패하는 원인이 될 수 있습니다.

(2) 구현은 GitHub : system, popen에서 찾을 수 있습니다. glibc에서의 크래시가 나에게 라이브러리 버그처럼 들린다 (신호 처리기 나 멀티 스레드 환경에서 popen을 사용하지 않는 한)

+0

SHELL이 설정되지 않았지만 설정하여 문제가 해결되지 않았습니다. 더 간단한 테스트 케이스로 되돌아 가서 다시보고해야합니다. 나는 당신과 데이빗이 제안한 바에 따라 앞으로 나아갈 경로가있을 것이라고 생각하지만 먼저 문제를 더 잘 이해할 필요가 있습니다. – corbin

+0

음,'system'은'#define SHELL_PATH "/ bin/sh"'를 사용합니다. SHELL을 통해 많은 영향을주었습니다 ... – nneonneo

+1

glibc 소스 코드를 수정하여 쉘 경로를 올바르게 정의하면 시스템 호출이 작동하지만 popen에 대해 동일한 변경을하면 문제가 해결되지 않습니다. 그걸 더 자세히 파고 들자. – corbin

1

고객님의 버전을 system으로 바꾸는 것이 좋습니다. 복잡하지 않으며 정확한 시스템 호출과 실패한 오류를 판별 할 수 있습니다. 대부분의 경우 셸이 올바르지 않고 오류가 발생합니다. 라이브러리가 존재하지 않는 셸 프로그램을 지정하고 있습니다.