I'm developing nasm like assembler, now l'm coding a process generating COFF formatted files.
My problem is very specific, I'm suffered from the field named value
on COFF Symbol Table
. I couldn't find the way to calculate or specify it.
I read the document Microsoft Portable Executable and Common Object File Format Specification. Following an article, which is I refered:
The Symbol Table described in this section is inherited from the traditional COFF format.
It is distinct from CodeView® information. A file may contain both a COFF Symbol
Table and CodeView debug information, and the two are kept separate. Some Microsoft
tools use the Symbol Table for limited but important purposes, such as communicating
COMDAT information to the linker. Section names and file names, as well as code and
data symbols, are listed in the Symbol Table.
The location of the Symbol Table is indicated in the COFF Header.
The Symbol Table is an array of records, each 18 bytes long. Each record is either a
standard or auxiliary symbol-table record. A standard record defines a symbol or name,
and has the following format:
|--------| -----|---------------|-------------------------------------------------------------------|
| Offset | Size | Field | Description |
|--------| -----|---------------|-------------------------------------------------------------------|
| 0 | 8 | Name (*) | Name of the symbol, represented by union of three structures. |
| | | | An array of eight bytes is used if the name is not more than |
| | | | eight bytes long. See Section 5.4.1, |
| | | | "Symbol Name Representation, " for more information. |
----------------------------------------------------------------------------------------------------|
| 8 | 4 | Value | Value associated with the symbol. |
| | | | The interpretation of this field depends on Section Number |
| | | | and Storage Class. A typical meaning is the relocatable address. |
----------------------------------------------------------------------------------------------------|
| 12 | 2 | SectionNumber | Signed integer identifying the section, using a one-based index |
| | | | into the Section Table. Some values have special meaning defined |
| | | | in "Section Number Values." |
----------------------------------------------------------------------------------------------------|
| 14 | 2 | Type | representing type. Microsoft tools set this field to 0x20 |
| | | | (function) or 0x0 (not a function). See Section 5.4.3, |
| | | | "Type Representation," for more information. |
----------------------------------------------------------------------------------------------------|
| 16 | 1 | StorageClass | Enumerated value representing storage class. |
| | | | See Section 5.4.4, "Storage Class," for more information. |
| | | | |
----------------------------------------------------------------------------------------------------|
| 17 | 1 | NumberOfAux | Number of auxiliary symbol table entries that follow this record. |
| | | Symbols | |
----------------------------------------------------------------------------------------------------|
I would like to know the way to specify Value
field to define basic C function symbol, for example _test
// define basic C function, I think it will be the symbol like "_test" in COFF files.
void test(int value) { return;}
This document said Value
field represents relocatable address
. How to know that ?
Finally, I realized the meaning of value
field.
This field represents the value of offsets from the beginning of symbol table. If there is any machine code between a symbol and an another symbol, this value should contain those byte size.
If there are two symbol in symbol table. COFF object should be like below;
name: 8byte , "symbol-name"
value: 4byte, 0
section_number: 2byte, 1 == section index (.text)
type: 2byte, 0
storageClass: 1byte, 2
numberOfAuxSymbole: 1byte, 0
name: 8byte , 0x0000000400000000
value: 4byte, offset between next symbol
section_number: 2byte, 1
type: 2byte, 0
storageClass: 1byte, 0x01
numberOfAuxSymbole: 1byte, 0x00
name: 8byte , "next symbol"
value: 4byte, 0
section_number: 2byte, 1 == section index (.text)
type: 2byte, 0
storageClass: 1byte, 2
numberOfAuxSymbole: 1byte, 0