「 2014年08月 」一覧

cygwinでクロスコンパイラのmake

ARM用クロスコンパイラのビルド(Windows8+Cygwin)
を参考にCygwinでクロスコンパイラのビルドをしてみました。
さすがに全部入りの状態なので、cygwinのインストールには時間がかかりました。

確かにgccのビルドまで成功までいけたのですが、thread modelがsingleに。
これをposix となるように –enable-threads=posix とするとgccのmake時にエラーとなってしまいうまくいかず…。

というエラー行が発端なので、pthread.hが正しく読み込めていないんだろうと思います。
(ファイルはあるけど中身がおかしい?)

Windowsでクロスコンパイラの準備から始めるのはちょっと大変なのがわかりました。


OpenGL 4.5 が発表されました

Siggraph2014開催期間中にOpenGL 4.5が発表されました。
そしてNVIDIAのドライバは既に公開が始まっているということで、早速インストールしてエクステンションリストの確認をしてみました。
リストは後述しますが、手元のボードが 650Ti ということもあり無事に拡張が使えるようです。

OpenGL 4.5のスライドはこれ OPENGL 4.5 UPDATE FOR NVIDIA GPUSがわかりやすいと思います。

DSA(DirectStateAccess)がコア機能に入っただとかロバスト関連がコアに入ったとかは順当な格上げとして、
個人的に驚いたのはDX11エミュレーション機能が(いまさら)含まれてきた点です。
特に、ビューポートの原点が左下だったのが左上に指定できる機能やZの範囲を0,1にできるようになった点はとても驚きです。
これは近いうちに実コードで試してみたいと思います。おそらくこれでFBOテクスチャの上下反転問題も気にしなくてよくなりそうな予感です。
なおこれららの拡張は GL_ARB_clip_control というものなので、実は4.5まで待たずとも既にドライバで対応済みの可能性があるようです(4.3付近でエクステンションに並んでいたとか噂です)。

あとスライドでようやく記載として乗りましたが、Linux (X11)でのEGLサポートだそうです。

さてお待ちかねのエクステンションリストです。

GL_AMD_multi_draw_indirect
GL_AMD_seamless_cubemap_per_texture
GL_ARB_arrays_of_arrays
GL_ARB_base_instance
GL_ARB_bindless_texture
GL_ARB_blend_func_extended
GL_ARB_buffer_storage
GL_ARB_clear_buffer_object
GL_ARB_clear_texture
GL_ARB_clip_control
GL_ARB_color_buffer_float
GL_ARB_compatibility
GL_ARB_compressed_texture_pixel_storage
GL_ARB_conservative_depth
GL_ARB_compute_shader
GL_ARB_compute_variable_group_size
GL_ARB_conditional_render_inverted
GL_ARB_context_flush_control
GL_ARB_copy_buffer
GL_ARB_copy_image
GL_ARB_cull_distance
GL_ARB_debug_output
GL_ARB_depth_buffer_float
GL_ARB_depth_clamp
GL_ARB_depth_texture
GL_ARB_derivative_control
GL_ARB_direct_state_access
GL_ARB_draw_buffers
GL_ARB_draw_buffers_blend
GL_ARB_draw_indirect
GL_ARB_draw_elements_base_vertex
GL_ARB_draw_instanced
GL_ARB_enhanced_layouts
GL_ARB_ES2_compatibility
GL_ARB_ES3_compatibility
GL_ARB_ES3_1_compatibility
GL_ARB_explicit_attrib_location
GL_ARB_explicit_uniform_location
GL_ARB_fragment_coord_conventions
GL_ARB_fragment_layer_viewport
GL_ARB_fragment_program
GL_ARB_fragment_program_shadow
GL_ARB_fragment_shader
GL_ARB_framebuffer_no_attachments
GL_ARB_framebuffer_object
GL_ARB_framebuffer_sRGB
GL_ARB_geometry_shader4
GL_ARB_get_program_binary
GL_ARB_get_texture_sub_image
GL_ARB_gpu_shader5
GL_ARB_gpu_shader_fp64
GL_ARB_half_float_pixel
GL_ARB_half_float_vertex
GL_ARB_imaging
GL_ARB_indirect_parameters
GL_ARB_instanced_arrays
GL_ARB_internalformat_query
GL_ARB_internalformat_query2
GL_ARB_invalidate_subdata
GL_ARB_map_buffer_alignment
GL_ARB_map_buffer_range
GL_ARB_multi_bind
GL_ARB_multi_draw_indirect
GL_ARB_multisample
GL_ARB_multitexture
GL_ARB_occlusion_query
GL_ARB_occlusion_query2
GL_ARB_pipeline_statistics_query
GL_ARB_pixel_buffer_object
GL_ARB_point_parameters
GL_ARB_point_sprite
GL_ARB_program_interface_query
GL_ARB_provoking_vertex
GL_ARB_robust_buffer_access_behavior
GL_ARB_robustness
GL_ARB_sample_shading
GL_ARB_sampler_objects
GL_ARB_seamless_cube_map
GL_ARB_seamless_cubemap_per_texture
GL_ARB_separate_shader_objects
GL_ARB_shader_atomic_counters
GL_ARB_shader_bit_encoding
GL_ARB_shader_draw_parameters
GL_ARB_shader_group_vote
GL_ARB_shader_image_load_store
GL_ARB_shader_image_size
GL_ARB_shader_objects
GL_ARB_shader_precision
GL_ARB_query_buffer_object
GL_ARB_shader_storage_buffer_object
GL_ARB_shader_subroutine
GL_ARB_shader_texture_image_samples
GL_ARB_shader_texture_lod
GL_ARB_shading_language_100
GL_ARB_shading_language_420pack
GL_ARB_shading_language_include
GL_ARB_shading_language_packing
GL_ARB_shadow
GL_ARB_sparse_buffer
GL_ARB_sparse_texture
GL_ARB_stencil_texturing
GL_ARB_sync
GL_ARB_tessellation_shader
GL_ARB_texture_barrier
GL_ARB_texture_border_clamp
GL_ARB_texture_buffer_object
GL_ARB_texture_buffer_object_rgb32
GL_ARB_texture_buffer_range
GL_ARB_texture_compression
GL_ARB_texture_compression_bptc
GL_ARB_texture_compression_rgtc
GL_ARB_texture_cube_map
GL_ARB_texture_cube_map_array
GL_ARB_texture_env_add
GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3
GL_ARB_texture_float
GL_ARB_texture_gather
GL_ARB_texture_mirror_clamp_to_edge
GL_ARB_texture_mirrored_repeat
GL_ARB_texture_multisample
GL_ARB_texture_non_power_of_two
GL_ARB_texture_query_levels
GL_ARB_texture_query_lod
GL_ARB_texture_rectangle
GL_ARB_texture_rg
GL_ARB_texture_rgb10_a2ui
GL_ARB_texture_stencil8
GL_ARB_texture_storage
GL_ARB_texture_storage_multisample
GL_ARB_texture_swizzle
GL_ARB_texture_view
GL_ARB_timer_query
GL_ARB_transform_feedback2
GL_ARB_transform_feedback3
GL_ARB_transform_feedback_instanced
GL_ARB_transform_feedback_overflow_query
GL_ARB_transpose_matrix
GL_ARB_uniform_buffer_object
GL_ARB_vertex_array_bgra
GL_ARB_vertex_array_object
GL_ARB_vertex_attrib_64bit
GL_ARB_vertex_attrib_binding
GL_ARB_vertex_buffer_object
GL_ARB_vertex_program
GL_ARB_vertex_shader
GL_ARB_vertex_type_10f_11f_11f_rev
GL_ARB_vertex_type_2_10_10_10_rev
GL_ARB_viewport_array
GL_ARB_window_pos
GL_ATI_draw_buffers
GL_ATI_texture_float
GL_ATI_texture_mirror_once
GL_S3_s3tc
GL_EXT_texture_env_add
GL_EXT_abgr
GL_EXT_bgra
GL_EXT_bindable_uniform
GL_EXT_blend_color
GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate
GL_EXT_blend_minmax
GL_EXT_blend_subtract
GL_EXT_compiled_vertex_array
GL_EXT_Cg_shader
GL_EXT_depth_bounds_test
GL_EXT_direct_state_access
GL_EXT_draw_buffers2
GL_EXT_draw_instanced
GL_EXT_draw_range_elements
GL_EXT_fog_coord
GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample
GL_EXTX_framebuffer_mixed_formats
GL_EXT_framebuffer_multisample_blit_scaled
GL_EXT_framebuffer_object
GL_EXT_framebuffer_sRGB
GL_EXT_geometry_shader4
GL_EXT_gpu_program_parameters
GL_EXT_gpu_shader4
GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil
GL_EXT_packed_float
GL_EXT_packed_pixels
GL_EXT_pixel_buffer_object
GL_EXT_point_parameters
GL_EXT_provoking_vertex
GL_EXT_rescale_normal
GL_EXT_secondary_color
GL_EXT_separate_shader_objects
GL_EXT_separate_specular_color
GL_EXT_shader_image_load_store
GL_EXT_shader_integer_mix
GL_EXT_shadow_funcs
GL_EXT_stencil_two_side
GL_EXT_stencil_wrap
GL_EXT_texture3D
GL_EXT_texture_array
GL_EXT_texture_buffer_object
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_latc
GL_EXT_texture_compression_rgtc
GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map
GL_EXT_texture_edge_clamp
GL_EXT_texture_env_combine
GL_EXT_texture_env_dot3
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_integer
GL_EXT_texture_lod
GL_EXT_texture_lod_bias
GL_EXT_texture_mirror_clamp
GL_EXT_texture_object
GL_EXT_texture_shared_exponent
GL_EXT_texture_sRGB
GL_EXT_texture_sRGB_decode
GL_EXT_texture_storage
GL_EXT_texture_swizzle
GL_EXT_timer_query
GL_EXT_transform_feedback2
GL_EXT_vertex_array
GL_EXT_vertex_array_bgra
GL_EXT_vertex_attrib_64bit
GL_EXT_import_sync_object
GL_IBM_rasterpos_clip
GL_IBM_texture_mirrored_repeat
GL_KHR_debug
GL_KHR_robust_buffer_access_behavior
GL_KHR_robustness
GL_KTX_buffer_region
GL_NV_bindless_multi_draw_indirect
GL_NV_bindless_multi_draw_indirect_count
GL_NV_bindless_texture
GL_NV_blend_equation_advanced
GL_NV_blend_square
GL_NV_compute_program5
GL_NV_conditional_render
GL_NV_copy_depth_to_color
GL_NV_copy_image
GL_NV_depth_buffer_float
GL_NV_depth_clamp
GL_NV_draw_texture
GL_NV_ES1_1_compatibility
GL_NV_ES3_1_compatibility
GL_NV_explicit_multisample
GL_NV_fence
GL_NV_float_buffer
GL_NV_fog_distance
GL_NV_fragment_program
GL_NV_fragment_program_option
GL_NV_fragment_program2
GL_NV_framebuffer_multisample_coverage
GL_NV_geometry_shader4
GL_NV_gpu_program4
GL_NV_gpu_program4_1
GL_NV_gpu_program5
GL_NV_gpu_program5_mem_extended
GL_NV_gpu_program_fp64
GL_NV_gpu_shader5
GL_NV_half_float
GL_NV_light_max_exponent
GL_NV_multisample_coverage
GL_NV_multisample_filter_hint
GL_NV_occlusion_query
GL_NV_packed_depth_stencil
GL_NV_parameter_buffer_object
GL_NV_parameter_buffer_object2
GL_NV_path_rendering
GL_NV_pixel_data_range
GL_NV_point_sprite
GL_NV_primitive_restart
GL_NV_register_combiners
GL_NV_register_combiners2
GL_NV_shader_atomic_counters
GL_NV_shader_atomic_float
GL_NV_shader_buffer_load
GL_NV_shader_storage_buffer_object
GL_NV_texgen_reflection
GL_NV_texture_barrier
GL_NV_texture_compression_vtc
GL_NV_texture_env_combine4
GL_NV_texture_expand_normal
GL_NV_texture_multisample
GL_NV_texture_rectangle
GL_NV_texture_shader
GL_NV_texture_shader2
GL_NV_texture_shader3
GL_NV_transform_feedback
GL_NV_transform_feedback2
GL_NV_vertex_array_range
GL_NV_vertex_array_range2
GL_NV_vertex_attrib_integer_64bit
GL_NV_vertex_buffer_unified_memory
GL_NV_vertex_program
GL_NV_vertex_program1_1
GL_NV_vertex_program2
GL_NV_vertex_program2_option
GL_NV_vertex_program3
GL_NVX_conditional_render
GL_NVX_gpu_memory_info
GL_NVX_nvenc_interop
GL_NV_shader_thread_group
GL_NV_shader_thread_shuffle
GL_KHR_blend_equation_advanced
GL_SGIS_generate_mipmap
GL_SGIS_texture_lod
GL_SGIX_depth_texture
GL_SGIX_shadow
GL_SUN_slice_accum
GL_WIN_swap_hint
WGL_EXT_swap_control

cygwinでcrosstool-ngのmake

クロスコンパイラなどのクロスツールチェインを作るためのツールとして、crosstool-ngが便利です。
Ubuntuなどではこれを利用してクロス環境を整えるのがとても手軽だと思っています。
今回はそのcrosstool-ngをWindowsのcygwinで生成できないかを試してみました。

そもそも、crosstool-ng は http://crosstool-ng.org/ で入手できます。
これを cygwin で使用するためには以下のパッチを適用します。このパッチはここで紹介されていましたが、パッチファイルがダウンロードできないようだったので、ここにテキストとして貼り付けておきます。

このパッチを適用してmakeする例としてはこんな感じで。

実際に動かす際には、Windowsのファイルシステムにおいて大文字小文字を区別するように変更する必要があるようです。
レジストリの次の場所を書き換えます。

実行とまとめ

/opt/cross/bin/ct-ng が実行可能状態になっていると思います。
あとはパスを通して実行できるように下上で、 ct-ng menuconfig や ct-ng build でツールチェインのビルドが可能だと思います。ただし、手元の環境ではどうもgccのmake途中でエラーになってしまいうまくいきませんでした。設定関連がわるい可能性があるので、それは調査中です


クロスコンパイラgccのビルド -成功編

ようやくクロスコンパイラ gccをmakeすることに成功しました。
JetsonTK1をターゲット想定なので、デフォルトで hard float を使用するようにしたかったので、その設定となるようにしています。
早速その手順をここに書いておきたいと思います。

makeinfoのバージョンが5以降だとエラーになるようなので、それ以前のものをインストールしておきます。

$ sudo apt-get install ncurses-dev gawk
$ tar xvzf texinfo-4.13a.tar.gz 
$ cd texinfo-4.13a
$ make
$ make install

gccに必要な他のライブラリを用意しておきます。

これらをとりあえず作業ディレクトリにダウンロードしておきます。

binutilsを準備

$ export CROSSTOOL=$HOME/cross-toolchains
$ export TARGET=arm-linux-gnueabi
$ export SYSROOT=$CROSSTOOL/$TARGET/sysroot

$ cd cross
$ tar xjf binutils-2.23.2.tar.bz2
$ mkdir -p binutils-2.23.2/build
$ cd binutils-2.23.2/build
$ ../configure --target=$TARGET --prefix=$CROSSTOOL --with-sysroot=$SYSROOT
$ make -j3 && make install

gmpの準備

$ cd ../..
$ tar xjf gmp-5.1.1.tar.bz2
$ mkdir -p gmp-5.1.1/build
$ cd gmp-5.1.1/build
$ ../configure --prefix=$CROSSTOOL
$ make -j3 &&  make install

mpfrの準備

$ cd ../..
$ tar xjf mpfr-3.1.2.tar.bz2
$ mkdir -p mpfr-3.1.2/build
$ cd mpfr-3.1.2/build
$ ../configure --prefix=$CROSSTOOL --with-gmp=$CROSSTOOL
$ make -j3 && make install

mpcの準備

$ cd ../..
$ tar xzf mpc-0.8.2.tar.gz
$ mkdir -p mpc-0.8.2/build
$ cd mpc-0.8.2/build
$ ../configure --prefix=$CROSSTOOL --with-gmp=$CROSSTOOL --with-mpfr=$CROSSTOOL
$ make -j3 
$ sudo make install

1st gccのmake

$ cd ../..
$ tar xjf gcc-4.8.2.tar.bz2
$ mkdir gcc-4.8.2/build1
$ cd gcc-4.8.2/build1
$ export CFLAGS_FP="--with-float=hard --with-fpu=vfp --with-arch=armv7-a"
$ ../configure --target=$TARGET --prefix=$CROSSTOOL \
  --without-headers \
  --without-ppl \
  --with-newlib \
  --disable-decimal-float \
  --disable-shared \
  --disable-threads --disable-libssp \
  --disable-libgomp --disable-libmudflap \
  --disable-libquadmath --disable-libatomic \
  --disable-sanitizer --disable-nls \
  --disable-libstdc++-v3 \
  --with-gmp=$CROSSTOOL \
  --with-mpfr=$CROSSTOOL \
  --with-mpc=$CROSSTOOL \
  --enable-languages=c \
  --with-mode=thumb \
  $CFLAGS_FP

$ make -j3
$ make install

2nd gccのための準備

1st gccが生成されている場所へパスを通しておきます。

$ export PATH=$PATH:$CROSSTOOL/bin

カーネルヘッダを準備します。

$ cd ../..
$ tar xjf linux-3.2.35.tar.bz2
$ cd linux-3.2.35
$ make mrproper
$ make headers_install ARCH=arm CROSS_COMPILE=${TARGET}- INSTALL_HDR_PATH=$SYSROOT/usr

glibcのヘッダの準備です。

$ cd ..
$ tar xzf eglibc-2_13.tar.gz
$ cd eglibc-2_13
$ cp -r ports libc
$ mkdir build
$ cd build
$ BUILD_CC=gcc CC=${TARGET}-gcc CXX=${TARGET}-g++ \
  AR=${TARGET}-ar \
  RANLIB=${TARGET}-ranlib \
  ../libc/configure \
    --prefix=/usr \
    --with-headers=${SYSROOT}/usr/include \
    --host=$TARGET \
    --disable-profile \
    --without-gd \
    --without-cvs \
    --enable-add-ons \
    --with-mode=thumb \
    $CFLAGS_FP

$ make install-headers install_root=$SYSROOT install-bootstrap-headers=yes
$ make csu/subdir_lib
$ mkdir -p ${SYSROOT}/usr/lib
$ cp csu/crt1.o csu/crti.o csu/crtn.o ${SYSROOT}/usr/lib
$ ${TARGET}-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o ${SYSROOT}/usr/lib/libc.so
$ ln -sv ${CROSSTOOL}/lib/gcc/${TARGET}/4.8.2/libgcc.a ${CROSSTOOL}/lib/gcc/${TARGET}/4.8.2/libgcc_eh.a

2nd gccのmake

$ cd ../..
$ mkdir gcc-4.8.2/build2
$ cd gcc-4.8.2/build2 
$ ../configure \
  --target=${TARGET} \
  --prefix=${CROSSTOOL} \
  --with-sysroot=${SYSROOT} \
  --disable-libssp --disable-libgomp --disable-libmudflap \
  --disable-shared \
  --with-gmp=${CROSSTOOL} \
  --with-mpfr=${CROSSTOOL} \
  --with-mpc=${CROSSTOOL} \
  --enable-languages=c \
  --with-system-zlib \
  --with-mode=thumb \
  ${CFLAGS_FP}
$ make -j3 all-gcc
$ make install-gcc

これで作成したgccでglibcを作成することになります.

glibcのmake

$ cd ../..
$ rm -rf eglibc-2_13\build
$ mkdir -p eglibc-2_13\build
$ cd eglibc-2_13\build
$ BUILD_CC=gcc \
  CC=${TARGET}-gcc \
  CXX=${TARGET}-g++ \
  AR=${TARGET}-ar \
  RANLIB=${TARGET}-ranlib \
  ../libc/configure \
      --prefix=/usr \
      --with-headers=${SYSROOT}/usr/include \
        --host=${TARGET} \
        --disable-profile \
        --without-gd \
        --without-cvs \
        --enable-add-ons \
        --with-mode=thumb \
	${CFLAGS_FP}
$ make -j3
$ make install install_root=$SYSROOT

3rd gccのmake

作成したglibcを参照するようなgccをmakeしていきます

$ cd ../..
$ mkdir -p gcc-4.8.2/build3
$ cd gcc-4.8.2/build3
$ ../configure \
  --target=${TARGET} \
  --prefix=${CROSSTOOL} \
  --with-sysroot=${SYSROOT} \
  --disable-libssp --disable-libgomp --disable-libmudflap \
  --disable-libquadmath \
  --with-gmp=${CROSSTOOL} \
  --with-mpfr=${CROSSTOOL} \
  --with-mpc=${CROSSTOOL} \
  --enable-languages=c,c++ \
  --with-system-zlib \
  --enable-nls \
  --enable-threads=posix \
  --enable-multilib \
  --enable-c99 \
  --with-mode=thumb \
  ${CFLAGS_FP}
$ make -j3
$ make install

これで完成です。


クロス向けのgdbを用意する

前回はターゲット上で作成しましたが、今回は開発ホスト想定のUbuntu上でターゲット向けのgdbを準備します。
ここでのターゲットはARM(32bit)でEABIHF(hard float)を想定しています。まぁJetson TK1想定です。

※ Ubuntuではarm向けのツールチェインをインストール済みであるとします。apt-get等でインストールしておいて下さい。

まずはxmlで必要になってくるので expat をインストールしておきます。

sudo apt-get install libexpat1-dev

gdbを本家サイトからダウンロードしてきて、展開します。また、buildディレクトリを作ってmake作業を行います。
他のユーザーに影響を与えないようにするため、 ホーム以下の host-tools にインストールされるようにしてみました。

$ tar xzf tar gdb-7.8.tar.gz
$ mkdir gdb-7.8/build
$ cd gdb-7.8/build
$ ../configure 
 --prefix=/home/appuser/host-tools \
 --target=armv7l-unknown-linux-gnueabihf \
 --with-expat --disable-nls \
 --disable-sim --disable-install-libbfd \
 --program-prefix=arm-linux-gnueabihf-

ここで –with-expatをつけてmakeしないと、XML読み込めていないエラーが発生するようです。
これをつけない場合、下記にしめすようなエラーが一緒に消えました!

Remote 'g' packet reply is too long:
09ea1180ffffffff009500000000000000000000000000000000100000000
(ゼロの連続なので省略)

このエラーはリモートのgdbserverに接続した際に出ていたものです。
gdbが用意できたことで、Ubuntu環境の中からgdbでデバッグすることが可能になりました。


gdbをターゲットでビルドしてみた

先日のARM開発環境をというネタからの流れではあるものの随分と手こずっています。手こずっているのはgccやglibcなどの
クロス環境のツールチェインのmakeでして、今のところ失敗の連続です。
 それで寄り道をして gdbserver をmakeしてみようと思います。ターゲット環境で gcc が使用可能な状態であることが条件です。幸いにして、Jetson TK1 は最初からgccが使用可能で、gdbもあるのであまりこの必要性は感じませんが、gdbserver を用意しておくことは開発時において貢献してくれそうです。

準備

gdb(gdbserver)だけではコンパイルできないので依存関係にある物をインストールしておきます。

$ sudo apt-get install texinfo
$ wget http://ftp.gnu.org/gnu/gdb/gdb-7.8.tar.gz
$ wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz

$ tar xzf termcap-1.3.1.tar.gz
$ tar xzf gdb-7.8.tar.gz

$ cd termcap-1.3.1
$ mkdir build
$ cd build
$ ../configure
$ make
$ sudo make install
$ cd ../..

コンパイルとインストール

gdb(gdbserver) をmakeします。

$ cd gdb-7.8
$ mkdir build
$ cd build
$ ../configure --prefix=/home/ubuntu/tools/debugger
$ make
$ make install

/home/ubuntu/tools/debugger/bin/gdbserver の場所にインストールされます。都合が悪い場合には prefixの値を変更して下さい。

動作テスト

別のUbuntu環境で arm linux eabihf対応の gdb を用いて、gdbserver に接続して動作確認をします。
手っ取り早くやるためには、UbuntuでLinaro gcc-linaro-arm-linux-gnueabihf-4.7 をダウンロードして展開し、この中のgdbを使用しました。
他にも
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install gcc-arm-linux-gnueabihf

とかやったのですが、うまく対象の gdb をいれることができなかったためです。
また、linaroのパッケージの物が 32bit のものだったので、下記のコマンドを入力して 32bit のものが動作するようにしています。

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

これら、昔は apt-get install ia32-libs でインストールしていましたが、今(14.04)は上記のようにやるような感じでした。

今回のターゲットは Jetson TK1 だったのですが、無事にホストPCからgdbコマンドを実行しつつ、ソースコードデバッグができるところまでを確認しました。
注意点としては、当然ですが EABIのgdbではうまく動作しません。ターゲットのABIにあわせたシロモノが必要になります(だから今回はEABIHF となっています


GALAXY Tab S 8.4を開発者目線で調べてみた

先日8月頭に発売された GALAXY Tab S 8.4(SM-T700 すなわちWiFiモデル) を調べてみました。基本的なことは各所のサイトで紹介されていると思いますので、ここではプログラマ目線で個人的に気になることを調べてみました。

初期状態でのOSは Android 4.4.2 です。
搭載しているプロセッサは、Samsung Exynos 5420 (Cortex-A7 x4 1.3GHz + A15 x4 1.9GHz) オクタコアです。
またこの中に入っている GPU は Mali-T628 となっています。
注意すべき点は、LTEモデルだとこのあたりが変わっていて、Snapdragon 800, Adreno330 となります。
画面解像度は、 2560×1600 WQXGA となっています。

個人的に、Snapdragon 800(Adreno330)は割と主流の流れなので、ここでは貴重なMali 6xx搭載の Wifiモデルを選ぶのがよさそうに思います。というか、GPUが他と違い珍しいので惹かれます。

さて、開発者として個人的に気にしている点が、このブログでも何度か登場しているNDKで開発してのネイティブデバッグができるか(ndk-gdbが使用可能であるか?)と、OpenGL ESの拡張はどのくらい、どんなものを備えているか、です。

ndk-gdb

サンプルのhello-jniでndk-gdbを起動させてみました。
結果はうまく動いていました。このあたりはさすがGalaxyシリーズと言ったところでしょうか。
この時点で開発用途には、現役で使えそうです。

OpenGL(ES)のExtension

この環境でエクステンションを取得してみました。GPUとOSからOpenGL ES 3.0だと思いますので期待できそうです。

GL Vendor = ARM
GL Renderer = Mali-T628

GL_EXT_debug_marker
GL_ARM_rgba8
GL_ARM_mali_shader_binary
GL_OES_depth24
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8
GL_EXT_read_format_bgra
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_standard_derivatives
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_required_internalformat
GL_OES_vertex_array_object
GL_OES_mapbuffer
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg
GL_EXT_texture_type_2_10_10_10_REV
GL_OES_fbo_render_mipmap
GL_OES_element_index_uint
GL_EXT_shadow_samplers
GL_KHR_texture_compression_astc_ldr
GL_KHR_debug
GL_EXT_occlusion_query_boolean
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_OES_get_program_binary
GL_OES_texture_3D
GL_EXT_texture_storage
GL_EXT_multisampled_render_to_texture
GL_OES_surfaceless_context
GL_ARM_mali_program_binary

このような結果になりました。良くも悪くもARMのGPUといったところでしょうか。テクスチャ圧縮のASTCがサポートされています。残念なのは、float texture に関するサポートがないようにみえるところです。 GL_OES_texture_float などが全く見当たりません。
また、3.0からはマルチレンダーターゲットがサポートされ、ディファードシェーディングもできる!と巷で話がありますが、これではfloat値をレンダーターゲットにできず、そのテクニックが使用不可能です。そもそも OpenGL ES 3.0 で FBO に float テクスチャをセットできるかは “GL_EXT_color_buffer_float” という別の拡張をサポートしているかがキーですが。

こういった特徴から、素のOpenGL ES 3.0 に近いGPUであるといえそうです。どのくらい標準的に普及するかは謎なところですが、テスト機の1台としてはなかなかそさそうには感じています。


クロスコンパイラgccのビルドがうまくいかない

ARMターゲットのプログラムをコンパイルするための、クロスコンパイラを自前でmakeしようと試行錯誤していますがうまくいきません。色々と調べてみて、1つ解決したかと思えば次また止まり、最終的にできあがったコンパイラでは正常に実行できるelfが出来上がらずといったところです。
折角なので、やってみたことを記録として残しておこうと思います。これでも誰かの参考になったら幸いです。

その1

gmp
mpfr
mpc
gcc
binutils
newlib

これらを用意してmakeしていきます。
gmp,mpfr,mpcらがgccで必要とするらしく・・・。またこれら出来上がった場所を LD_LOAD_LIBRARY に追加して soを参照できるようにしてみました。
というのも、gccのmake過程で GCC_NO_EXECUTABLES エラーがでてしまい・・・解決するかと思ったのですが。so解決しても結局解消することは不可能でした。また –disable-dlopenも試してみたのですがこれもまたNG

その2

export TARGET=arm-eabi
export PREFIX=/usr/local/gnu
configure –prefix=$PREFIX –target=$TARGET –enable-interwork –enable-multilib –enable-languages=c –with-newlib –disable-shared –disable-thread –without-headers –disable-libssp

これでgccを makeしてみるとうまくいった.ただし期待したシロモノができない。
理由は arm-eabi だったから。今ほしいのは eabihf の ABI
arm-linux-gnueabihf をターゲットとしてmakeさせると、エラーが発生。GCC_NO_EXECUTABLES 問題解決できず終了。

その3

どうやら gccのコンパイル過程で makeinfo が問題となっているよう。
apt-get install texinfo で makeinfo も片付くが、バージョンが問題になっている模様。新しいバージョンだとgccのmake過程でエラーが発生してしまう。
そこで、 makeinfo のバージョンを 5.0未満にすべく、古い物をソースからインストールしてみた。4.13あたりでチャレンジした。
これでgccのmakeはうまくいくようになるが、別の問題が発生。

arm-linux-gnueabihf のABIでパッチ当てたりしてmakeしてみるものの 失敗。armアセンブラが解釈できない何かでglibcの生成で失敗。
なお、 http://keropo.hatenadiary.com/entry/2013/04/14/232244 を参考にして eabi ならばうまくgccが生成できるところまではこぎ着けた。すごく参考になりました。

まとめ

クロスコンパイラgccを準備するのは非常に大変。
外部から提供される or 同梱されているならばそれを使うのが吉です。自力で用意してやろうとか欲を出すと、これに相当時間を取られそうです。
とはいえ、あまりにあまりな結果だったので他の方法もまだ探してみたいと思います。