📄 browsio.c
字号:
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include "cvars.h"
#include "exeelf.h"
#include "iopath.h"
#include <stdarg.h>
#include <unistd.h>
#include "dw.h"
static uint_32 relocValues[ DW_W_MAX ];
typedef struct c_dw_section {
unsigned bufcount;
char **bufptrs;
unsigned long offset;
unsigned long length;
} C_DW_SECTION;
static C_DW_SECTION DWSections[DW_DEBUG_MAX];
static void DWSectInit( void )
{
int i;
for( i = 0; i < DW_DEBUG_MAX; ++i ){
DWSections[i].bufcount = 0;
DWSections[i].bufptrs = NULL;
DWSections[i].offset = 0;
DWSections[i].length = 0;
}
}
#define C_DWARF_BUFSIZE 4096
extern FILE *OpenBrowseFile(); /* ccmain */
// -- code to generate ELF output ------------------------------------------
//
// note: the pre-initialized fields in these structures assume the following
// layout in the file
// elf_header
// string_table
// .debug_abbrev
// .debug_info
// .WATCOM_references
// .debug_line
// .debug_macinfo
// section_header_index0
// section_header_string_table
// section_header_template( .debug_abbrev )
// section_header_template( .debug_info )
// section_header_template( .WATCOM_references )
// section_header_template( .debug_line )
// section_header_template( .debug_macinfo )
//
Elf32_Ehdr elf_header = {
{ ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,
ELFCLASS32, ELFDATA2LSB, EV_CURRENT },
ET_DYN,
EM_386,
EV_CURRENT,
0,
0,
0,//<offset of section table>=sizeof(Elf32_Ehdr)+sizeof(string_table)+sizes of 5 sections
0,
sizeof( Elf32_Ehdr ),
sizeof( Elf32_Phdr ),
0,
sizeof( Elf32_Shdr ),
7,
1
};
#define STR_NAME0 "\0"
#define STR_SHSTRTAB ".shstrtab\0"
#define STR_DBG_ABBREV ".debug_abbrev\0"
#define STR_DBG_INFO ".debug_info\0"
#define STR_DBG_REF ".WATCOM_references\0"
#define STR_DBG_LINE ".debug_line\0"
#define STR_DBG_MACINFO ".debug_macinfo\0"
#define OFF_NAME0 (0)
#define OFF_SHSTRTAB (OFF_NAME0 + sizeof( STR_NAME0 ) - 1)
#define OFF_DBG_ABBREV (OFF_SHSTRTAB + sizeof( STR_SHSTRTAB ) - 1)
#define OFF_DBG_INFO (OFF_DBG_ABBREV + sizeof( STR_DBG_ABBREV ) - 1)
#define OFF_DBG_REF (OFF_DBG_INFO + sizeof( STR_DBG_INFO ) - 1)
#define OFF_DBG_LINE (OFF_DBG_REF + sizeof( STR_DBG_REF ) - 1)
#define OFF_DBG_MACINFO (OFF_DBG_LINE + sizeof( STR_DBG_LINE ) - 1)
#define OFF_MAX (OFF_DBG_MACINFO + sizeof( STR_DBG_MACINFO ) - 1)
char string_table[OFF_MAX + 1] = {
STR_NAME0
STR_SHSTRTAB
STR_DBG_ABBREV
STR_DBG_INFO
STR_DBG_REF
STR_DBG_LINE
STR_DBG_MACINFO
};
unsigned string_table_offsets[] = {
OFF_DBG_ABBREV,
OFF_DBG_INFO,
OFF_DBG_REF,
OFF_DBG_LINE,
OFF_DBG_MACINFO
};
Elf32_Shdr section_header_index0 = {
0, SHT_NULL, 0, 0, 0, 0, SHN_UNDEF, 0, 0, 0
};
Elf32_Shdr section_header_string_table = {
OFF_SHSTRTAB,
SHT_STRTAB,
0,
0,
sizeof( Elf32_Ehdr ),
sizeof( string_table ),
SHN_UNDEF,
0,
0,
0
};
Elf32_Shdr section_header_template = {
0,//<index of name in string section>
SHT_PROGBITS,
0,
0,
0,//<offset of section in file>
0,//<size of section>
SHN_UNDEF,
0,
0,
0
};
void CFatal( char *msg )
{
printf( "%s\n", msg );
}
void mywrite( FILE *fp, void *data, size_t len )
{
size_t wroteSize;
wroteSize = fwrite( data, 1, len, fp );
if( wroteSize < len ) {
puts( strerror( errno ) );
CFatal( "error on write" );
}
}
static int createBrowseFile(FILE* browseFile, /* target file */
C_DW_SECTION* abbrevFile, /* .debug_abbrev section */
C_DW_SECTION* debugFile, /* .debug_info section */
C_DW_SECTION* referenceFile, /* .WATCOM_reference section */
C_DW_SECTION* lineFile, /* .debug_line section */
C_DW_SECTION* macroFile /* .debug_macinfo section */
)
{
char *ptr;
size_t bufsize;
int fileNum;
unsigned bufnum;
C_DW_SECTION *inFile[5];
C_DW_SECTION *dwsect;
unsigned long sectionSize;
unsigned long sectionOffset[5];
// write elf header
elf_header.e_shoff = sizeof( Elf32_Ehdr )
+ sizeof( string_table )
+ abbrevFile->length
+ debugFile->length
+ referenceFile->length
+ lineFile->length
+ macroFile->length;
mywrite( browseFile, (void *)&elf_header, sizeof( elf_header ) );
// write string table
mywrite( browseFile, (void *)string_table, sizeof( string_table ) );
// write each of the 5 sections, tracking offset
inFile[0] = abbrevFile;
inFile[1] = debugFile;
inFile[2] = referenceFile;
inFile[3] = lineFile;
inFile[4] = macroFile;
sectionOffset[0] = sizeof( elf_header ) + sizeof( string_table );
sectionOffset[1] = sectionOffset[0] + inFile[0]->length;
sectionOffset[2] = sectionOffset[1] + inFile[1]->length;
sectionOffset[3] = sectionOffset[2] + inFile[2]->length;
sectionOffset[4] = sectionOffset[3] + inFile[3]->length;
for( fileNum = 0; fileNum < 5; fileNum++ ) {
dwsect = inFile[ fileNum ];
bufnum = 0;
sectionSize = dwsect->length;
while( sectionSize ) {
bufsize = C_DWARF_BUFSIZE;
if( bufsize > sectionSize ) bufsize = sectionSize;
ptr = dwsect->bufptrs[bufnum];
mywrite( browseFile, ptr, bufsize );
CMemFree( ptr );
sectionSize -= bufsize;
++bufnum;
}
if( dwsect->bufptrs != NULL ) {
CMemFree( dwsect->bufptrs );
}
}
// write section_header_index0
mywrite( browseFile, (void *)§ion_header_index0,
sizeof( section_header_index0 ) );
// write section_header_string_table
mywrite( browseFile, (void *)§ion_header_string_table,
sizeof( section_header_string_table ) );
// write rest of section headers
for( fileNum = 0; fileNum < 5; fileNum++ ) {
section_header_template.sh_name = string_table_offsets[fileNum];
section_header_template.sh_offset = sectionOffset[fileNum];
section_header_template.sh_size = inFile[fileNum]->length;
mywrite( browseFile, (void *)§ion_header_template,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -