Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void printUsageHelp()
- {
- printf("as86 binary includer\n\n");
- printf("\t Usage: as86_binin assembler_binary as86_symbol_file label_name include_file\n\n");
- printf("as86_binin replaces the content of the 'assembler_binary' starting from the offset of the label 'label_name' found in 'as86_symbol_file' with the content of 'include_file'. Make sure you created enough space in the binary, i.e. by using .SPACE\n");
- }
- int main(int argc, char* argv[]) {
- if (argc != 5) {
- printUsageHelp();
- return 1;
- }
- int bin_desc, symbol_desc, inc_desc;
- if ((bin_desc = open(argv[1], O_RDWR)) == -1)
- {
- printf("Could not open binary file '%s'\n", argv[1]);
- return 1;
- }
- if ((symbol_desc = open(argv[2], O_RDONLY)) == -1)
- {
- close(bin_desc);
- printf("Could not open symbol file '%s'\n", argv[2]);
- return 1;
- }
- if((inc_desc = open(argv[4], O_RDONLY)) == -1)
- {
- close(bin_desc);
- close(symbol_desc);
- printf("Could not open include file '%s'\n", argv[4]);
- return 1;
- }
- long size = lseek(symbol_desc, 0, SEEK_END);
- lseek(symbol_desc, 0, SEEK_SET);
- char *buffer = (char*)malloc(size + 1);
- read(symbol_desc, buffer, size);
- buffer[size + 1] = 0;
- int search_lenght = strlen(argv[3]);
- char *pattern = (char*)malloc(search_lenght + 2);
- pattern[0] = ' ';
- strcpy(pattern + 1, argv[3]);
- char* hex_string = strstr(buffer, pattern);
- if (hex_string == 0 || hex_string < buffer + 14) {
- printf("Incompatible symbol file '%s'\n", argv[2]);
- free(buffer);
- free(pattern);
- close(bin_desc);
- close(symbol_desc);
- close(inc_desc);
- return 1;
- }
- hex_string -= 14; // hex number sequence is 14 chars in front of the symbol name with whitespace (simply the file format)
- long bin_offset = strtol(hex_string, 0, 16);
- free(buffer);
- free(pattern);
- close(symbol_desc);
- size = lseek(inc_desc, 0, SEEK_END);
- lseek(inc_desc, 0, SEEK_SET);
- buffer = (char*)malloc(size);
- lseek(bin_desc, bin_offset, SEEK_SET);
- if (read(inc_desc, buffer, size) == -1)
- {
- printf("Could read from include file '%s'\n", argv[4]);
- free(buffer);
- close(bin_desc);
- close(inc_desc);
- return 1;
- }
- if (write(bin_desc, buffer, size) == -1)
- {
- printf("Could not write to binary file '%s'\n", argv[1]);
- free(buffer);
- close(bin_desc);
- close(inc_desc);
- return 1;
- }
- free(buffer);
- close(bin_desc);
- close(inc_desc);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement