Syscall 생성시 자료형 double 에 대한 에러.. ^^

hanseok의 이미지

X86에서 시스템 콜을 몇개 정의하여서 사용하고 있었습니다.

이것을 ARM 보드로 포팅하는 과정에서

H/W 의존성이 있는것은
entry.S ==> calls.S
unistd.h ==> unistd.h ( 다른 디렉토리 )

이정도여서 그냥 설정하고 컴파일 했더니..

kernel/kernel.o(.text+0x13abc): undefined reference to `__gtdf2'
kernel/kernel.o(.text+0x13acc): undefined reference to `__floatsidf'
kernel/kernel.o(.text+0x13ae0): undefined reference to `__divdf3'
kernel/kernel.o(.text+0x13b14): undefined reference to `__gedf2'
kernel/kernel.o(.text+0x13bfc): undefined reference to `__gedf2'
kernel/kernel.o(.text+0x13d44): undefined reference to `__gedf2'
kernel/kernel.o(.text+0x13e2c): undefined reference to `__gedf2'

위와 같은 에러를 나타내더군요..

이유를 찾아서 무진장 시간 투자를 했죠. 삽질..

그리고 찾은것이 몇개의 시스템 콜을 구현하는 부분에서
double 자료형을 사용했다는 것이였습니다.

double <== 이놈이 arm 에서 적용이 안되는것인가요?

arm 용 커널에서는 그럼 실수형은 무엇을 사용해야 하는지. 궁금하네요
일단은 제가 사용한 변수들이라. 모두 unsigned long으로 변환을 하고 소스를 수정해 주었습니다.

궁금하네.. double 때문에 저런 에러가 날줄은 전혀 몰랐습니다.

방준영의 이미지

커널에서 부동소숫점을 쓰려면 연산에 필요한 런타임을 명시적으로 링크해 주어야 합니다. 에러는 런타임 함수들을 링커가 찾지 못했기 때문에 발생한 것입니다. libgcc나 해당 OS의 런타임 소스 코드를 찾아 보시면 함수가 있을 것입니다.

이 문제는 arm뿐만 아니라 다른 아키텍쳐에도 공통적으로 적용되는 문제입니다. 그리고 런타임뿐만 아니라 커널에서의 부동소숫점 연산은 사용자 모드와 커널 모드 전환시 레지스터 보존을 깨뜨릴 가능성이 있기 때문에

부동소숫점연산하겠음();
부동소숫점 연산...
부동소숫점연산다했음();

처럼 코드 블록을 보호해 줄 필요도 있습니다. 사용자 모드에서의 작업보다 까다로운 면이 있죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.