2021年4月13日火曜日

昔 nasm で書いたコードのオブジェクトを gcc でリンクしようとして PIE のエラー対処

 なんでもないことだけど、

$ nasm  foo.asm

$ gcc  -no-pie  foo.o

-no-pie オプションで解決する。

PIE = Position Independent Executable


参考例

fibonacci numbers


        global  main

        extern  printf

        section .text

main:

        push    rbx                

        mov     ecx, 90                 ;  count 90

        xor     rax, rax                

        xor     rbx, rbx                

        inc     rbx                    

print:

        push    rax              

        push    rcx              

        mov     rdi, format     

        mov     rsi, rax             

        xor     rax, rax            

        call    printf                  ; printf(format, number)

        pop     rcx               

        pop     rax              

        mov     rdx, rax         

        mov     rax, rbx           

        add     rbx, rdx           

        dec     ecx               

        jnz     print            

        pop     rbx        

        ret

format:

        db  "%20ld", 10, 0


$ nasm -felf64 fib.asm

$ gcc -no-pie fib.o  -o fib

$ fib

                   0

                   1

                   1

                   2

                   3

                   5

                   8

                  13

                  21

                  34

                  55

                  89

                 144

                 233

                 377

                 610

                 987

                1597

                2584

                4181

                6765

               10946

               17711

               28657

               46368

               75025

              121393

              196418

              317811

              514229

              832040

             1346269

             2178309

             3524578

             5702887

             9227465

            14930352

            24157817

            39088169

            63245986

           102334155

           165580141

           267914296

           433494437

           701408733

          1134903170

          1836311903

          2971215073

          4807526976

          7778742049

         12586269025

         20365011074

         32951280099

         53316291173

         86267571272

        139583862445

        225851433717

        365435296162

        591286729879

        956722026041

       1548008755920

       2504730781961

       4052739537881

       6557470319842

      10610209857723

      17167680177565

      27777890035288

      44945570212853

      72723460248141

     117669030460994

     190392490709135

     308061521170129

     498454011879264

     806515533049393

    1304969544928657

    2111485077978050

    3416454622906707

    5527939700884757

    8944394323791464

   14472334024676221

   23416728348467685

   37889062373143906

   61305790721611591

   99194853094755497

  160500643816367088

  259695496911122585

  420196140727489673

  679891637638612258

 1100087778366101931

 1779979416004714189


結果を gforth と比較


$ gforth

Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.

Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'

Type `bye' to exit

: fib ( n -- fib )  compiled

  0 1 rot 0 ?do  over + swap  loop drop ;  ok

89 fib . 1779979416004714189  ok


Go 言語の結果と比較

package main


import (

  "fmt"

)


func fib(n int) int {

  if n < 2 {

          return n

  }

  a, b := 0, 1

  for n--; n>0; n-- {

    a = a+b

    a, b = b, a

  }

  return b

}

func main() {

  fmt.Println(fib(89))

}

1779979416004714189


Haskell の結果と比較

main :: IO ()
main =
  print
    [ floor (0.01 + (1 / p ** n + p ** n) / sqrt 5)
    | let p = (1 + sqrt 5) / 2
    , n <- [0 .. 99] ]

[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073,4807526976,7778742049,12586269025,20365011074,32951280099,53316291173,86267571272,139583862445,225851433717,365435296162,591286729879,956722026041,1548008755920,2504730781961,4052739537881,6557470319842,10610209857723,17167680177565,27777890035288,44945570212853,72723460248141,117669030460994,190392490709135,308061521170129,498454011879265,806515533049395,1304969544928660,2111485077978055,3416454622906715,5527939700884771,8944394323791488,14472334024676260,23416728348467744,37889062373144008,61305790721611752,99194853094755776,160500643816367552,259695496911123328,420196140727490880,679891637638614272,1100087778366105088,1779979416004719360,2880067194370824704,4660046610375544832,7540113804746369024,12200160415121913856,19740274219868282880,31940434634990198784,51680708854858489856,83621143489848688640,135301852344707186688,218922995834555891712]

0 件のコメント:

コメントを投稿

地球規模で増加し、国単位で減少し、地元で減ってゆくのが目にみえるようだ

 地元の回覧板で、このあたりの世帯数が 1033 になったことを知る。 今朝の新聞では、この国でこのところ海外永住者が増加している記事が一面に出ていた。 歴史的にみれば地球規模での人口移動は集落を越え、国境を越えてあったこと。 今さらのことでもなく、寂れてゆくところと繁栄するとこ...