Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/xtansia/bin2s
Convert binary files to GCC assembly modules
https://github.com/xtansia/bin2s
assembly binary-data cmake converter cpp11
Last synced: 3 months ago
JSON representation
Convert binary files to GCC assembly modules
- Host: GitHub
- URL: https://github.com/xtansia/bin2s
- Owner: Xtansia
- License: mpl-2.0
- Created: 2017-02-07T03:34:16.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2024-04-23T22:56:27.000Z (9 months ago)
- Last Synced: 2024-04-24T13:10:13.950Z (9 months ago)
- Topics: assembly, binary-data, cmake, converter, cpp11
- Language: C++
- Size: 26.4 KB
- Stars: 5
- Watchers: 2
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# bin2s
Convert binary files to GCC assembly modules.A C++17 port of devkitPro's [bin2s](https://github.com/devkitPro/general-tools/blob/master/bin2s.c).
```
bin2s {OPTIONS} [FILES...]Convert binary files to GCC assembly modules.
OPTIONS:
-h, --help Show this help message and exit
-a [ALIGNMENT],
--alignment=[ALIGNMENT] Boundary alignment, in bytes [default:
4]
-l [LINE_LENGTH],
--line-length=[LINE_LENGTH] Number of bytes to output per line of
ASM [default: 16]
-o [OUTPUT], --output=[OUTPUT] Output file, "-" represents stdout
[default: -]
FILES... Binary file to convert to GCC assembly
"--" can be used to terminate flag options and force all following
arguments to be treated as positional optionsFor each input file it will output assembly defining:
* {identifier}:
An array of bytes containing the data.
* {identifier}_end:
Will be at the location directly after the end of the data.
* {identifier}_size:
An unsigned int containing the length of the data in bytes.Roughly equivalent to this pseudocode:
const unsigned int identifier_size = ...
const unsigned char identifier[identifier_size] = { ... }
const unsigned char identifier_end[] = identifier + identifier_sizeWhere {identifier} is the input file's name,
sanitized to produce a legal C identifier, by doing the following:* Stripping all character that are not ASCII letters, digits or one of _-./
* Replacing all of -./ with _
* Prepending _ if the remaining identifier begins with a digit.e.g. for gfx/foo.bin {identifier} will be foo_bin,
and for 4bit.chr it will be _4bit_chr.
```## Example
Given input file `hello_world.txt`:
```
Hello World
```It will produce the following assembly:
```
.section .rodata
.balign 4
.global hello_world_txt
.global hello_world_txt_end
.global hello_world_txt_sizehello_world_txt:
.byte 72,101,108,108,111, 32, 87,111,114,108,100hello_world_txt_end:
.align
hello_world_txt_size: .int 11
```You can then use it from your program by for example creating a header like so:
```c
extern const unsigned char hello_world_txt[];
extern const unsigned char hello_world_txt_end[];
extern const unsigned int hello_world_txt_size;
```## CMake
Here's an example CMake snippet to automatically download & build bin2s,
and add a function for creating a library target from binary files.```cmake
include(ExternalProject)ExternalProject_Add(bin2s_git
PREFIX vendor/
GIT_REPOSITORY https://github.com/Xtansia/bin2s
GIT_TAG master
GIT_SUBMODULES
UPDATE_COMMAND ""
PATCH_COMMAND ""
BUILD_COMMAND ""
CMAKE_ARGS
"-DCMAKE_BUILD_TYPE=Release"
"-DCMAKE_INSTALL_PREFIX="
INSTALL_COMMAND
"${CMAKE_COMMAND}"
--build .
--target install
--config Release)add_executable(bin2s IMPORTED GLOBAL)
set_target_properties(bin2s PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/vendor/bin/bin2s)
add_dependencies(bin2s bin2s_git)function(add_binfile_library target_name)
if (NOT ${ARGC} GREATER 1)
message(FATAL_ERROR "add_binfile_library : Argument error (no input files)")
endif()
get_cmake_property(_enabled_languages ENABLED_LANGUAGES)
if (NOT _enabled_languages MATCHES ".*ASM.*")
message(FATAL_ERROR "add_binfile_library : ASM language needs to be enabled")
endif()set(_output_dir ${CMAKE_CURRENT_BINARY_DIR}/binfile_asm)
set(_output_file ${_output_dir}/${target_name}.s)
file(MAKE_DIRECTORY ${_output_dir})add_custom_command(OUTPUT ${_output_file}
COMMAND bin2s -o "${_output_file}" ${ARGN}
DEPENDS ${ARGN}
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
add_library(${target_name} ${_output_file})
endfunction()
```Which you could then use like so:
```cmake
add_binfile_library(resources res/some_picture.png)add_executable(myprogram src/main.cpp)
target_link_libraries(myprogram resources)
```