

# 現環境の説明

今現在は、仮想マシン上でopenwrt用のsdkを用いてクロスコンパイルを行っています。

[OpenWRT環境で動くC言語プログラムのコンパイル方法](https://qiita.com/asuzuki2008/items/e89bd0733689a7601c08)

この方の記事を参考に実行していますが、5年以上の前の記事のため所々変えながら動かしている状況です。

変更した部分は

[code]

    https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
    
    から
    
    https://archive.openwrt.org/releases/22.03.5/targets/ath79/generic/openwrt-sdk-22.03.5-ath79-generic_gcc-11.2.0_musl.Linux-x86_64.tar.xz
    
    に変更
    
[/code]

その後、パスを

[code]

    export cc=/home/****/openwrt/staging_dir/toolchain-mips_24kc_gcc-11.2.0_musl/bin/mips-openwrt-linux-musl-gcc
    
    export STAGING_DIR=/home/****/openwrt/staging_dir/toolchain-mips_24kc_gcc-11.2.0_musl
    
[/code]

に変更しています。

# 起きている問題点

クロスコンパイル後のファイルをscpでコピー、実行しようとするとsysntax errorと出てきます。

[code]

    ./helloworld
    ./helloworld: line 0: syntax error: unexpected word (expecting ")")
    root@OpenWrt:~# cat helloworld
    @@@@((uu   -==X`-==8880hhhDDStd8880Ptd   44QtdRtd-==HH/lib64/ld-linux-x86-64.so.2 GNUGNUypTvq!rGNUemH "d s "__cxa_finalize__libc_start_mainputslibc.so.6GLIBC_2.2.5GLIBC_2.34_ITM_deregisterTMCloneTable__gmon_start___ITM_registerTMCloneTable'ui   1=@@??????H/Ht5/%/h%/D%u/D1I^HHPTE11H=S/f.H=y/Hr/H9tH6/Ht        H=I/H5B/H)HH?HHHtH/HfD=/u+UH=.HtH=.dh=oHHH]Hello World4h0@PP9zRx$4 FJ?:*3$"\tqEC
    ?P   oo ooo=0@GCC: (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0     3I@U=|@= = ? M @->@EhK@X g@ @Q`&@I@ "Scrt1.o__abi_tagcrtstuff.cderegister_tm_clones__do_global_dtors_auxcompleted.0__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entryhelloworld.c__FRAME_END___DYNAMIC__GNU_EH_FRAME_HDR_GLOBAL_OFFSET_TABLE___libc_start_main@GLIBC_2.34_ITM_deregisterTMCloneTableputs@GLIBC_2.2.5_edata_fini__data_start__gmon_start____dso_handle_IO_stdin_used_end__bss_startmain__TMC_END___ITM_registerTMCloneTable__cxa_finalize@GLIBC_2.2.5_init.symtab.strtab.shstrtab.interp.note.gnu.property.note.gnu.build-id.note.ABI-tag.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.got.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.dynamic.data.bss.comment#886hh$I Wo$aiqo~o  0PPB@    4H H=-?@0@00-@0`     35root@OpenWrt:~#
    
[/code]

異なるアーキテクチャでコンパイルすると、このようなエラーが出ることは知っていますが、どこで間違えているかがわかりません。

よろしくお願いいたします。

# デバイス情報

[code]

    cat cpuinfo
    system type             : Atheros AR7242 rev 1
    machine                 : Buffalo WZR-HP-G450H/WZR-450HP
    processor               : 0
    cpu model               : MIPS 24Kc V7.4
    BogoMIPS                : 265.42
    wait instruction        : yes
    microsecond timers      : yes
    tlb_entries             : 16
    extra interrupt vector  : yes
    hardware watchpoint     : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
    isa                     : mips1 mips2 mips32r1 mips32r2
    ASEs implemented        : mips16
    Options implemented     : tlb 4kex 4k_cache prefetch mcheck ejtag llsc dc_aliases perf_cntr_intr_bit perf
    shadow register sets    : 1
    kscratch registers      : 0
    package                 : 0
    core                    : 0
    VCED exceptions         : not available
    VCEI exceptions         : not available
    
[/code]

[openwrtの方の情報も載せておきます](https://openwrt.org/toh/hwdata/buffalo/buffalo_wzr-
hp-g450h_v1)

# 追記情報

## コンパイル時のコマンド

[code]

    cd helloworld/
    $ export cc=/home/****/openwrt/staging_dir/toolchain-mips_24kc_gcc-11.2.0_musl/bin/mips-openwrt-linux-musl-gcc
    $ export STAGING_DIR=/home/****/openwrt/staging_dir/toolchain-mips_24kc_gcc-11.2.0_musl
    
    $ cc -o helloworld_.o helloworld.c
    $ ls
    helloworld  helloworld.c  helloworld.o  helloworld_.o
    
[/code]

## fileコマンドによる確認結果

[code]

    $ file helloworld_.o
    helloworld_.o: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=7970d60ea39eaa8515cd165476711a8721720092, for GNU/Linux 3.2.0, not stripped
    
[/code]


CC BY-SA 4.0
2023-07-16T16:51:17.250
95653
2023-07-17T05:26:30.560
2023-07-17T05:26:30.560
3060
58699
question
linux c gcc compiler
openwrtにおけるクロスコンパイルエラー(アーキテクチャの間違いによるsysntax error)


「コンパイルする際のコマンド」に誤りが有ります。

> `$ export cc=/home/...`

として変数 `cc` に代入していますが、これが使われていません。コンパイル時に

> `$ cc -o helloworld_.o helloworld.c`

としていますが、本来はこの箇所で使いたかったのではないでしょうか。つまり、

> `$ $cc -o helloworld_.o helloworld.c`

のような使い方です。参考になさっているサイトでは変数には大文字の `CC` を使っているようですね。そちらの方が間違えにくくて良いかも知れません。


CC BY-SA 4.0
2023-07-17T02:31:39.940
95656
2023-07-17T02:31:39.940
3054
95653
answer