Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
1abb0a57
Commit
1abb0a57
authored
Oct 04, 2004
by
Robert Shearman
Committed by
Alexandre Julliard
Oct 04, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for .gnu_debuglink.
parent
ccdea75d
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
177 additions
and
21 deletions
+177
-21
elf_module.c
dlls/dbghelp/elf_module.c
+177
-21
No files found.
dlls/dbghelp/elf_module.c
View file @
1abb0a57
...
...
@@ -459,19 +459,139 @@ static int elf_new_public_symbols(struct module* module, struct hash_table* symt
return
TRUE
;
}
/* Copyright (C) 1986 Gary S. Brown. Modified by Robert Shearman. You may use
the following calc_crc32 code or tables extracted from it, as desired without
restriction. */
/**********************************************************************\
|* Demonstration program to compute the 32-bit CRC used as the frame *|
|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71 *|
|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level *|
|* protocol). The 32-bit FCS was added via the Federal Register, *|
|* 1 June 1982, p.23798. I presume but don't know for certain that *|
|* this polynomial is or will be included in CCITT V.41, which *|
|* defines the 16-bit CRC (often called CRC-CCITT) polynomial. FIPS *|
|* PUB 78 says that the 32-bit FCS reduces otherwise undetected *|
|* errors by a factor of 10^-5 over 16-bit FCS. *|
\**********************************************************************/
/* First, the polynomial itself and its table of feedback terms. The */
/* polynomial is */
/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
/* Note that we take it "backwards" and put the highest-order term in */
/* the lowest-order bit. The X^32 term is "implied"; the LSB is the */
/* X^31 term, etc. The X^0 term (usually shown as "+1") results in */
/* the MSB being 1. */
/* Note that the usual hardware shift register implementation, which */
/* is what we're using (we're merely optimizing it by doing eight-bit */
/* chunks at a time) shifts bits into the lowest-order term. In our */
/* implementation, that means shifting towards the right. Why do we */
/* do it this way? Because the calculated CRC must be transmitted in */
/* order from highest-order term to lowest-order term. UARTs transmit */
/* characters in order from LSB to MSB. By storing the CRC this way, */
/* we hand it to the UART in the order low-byte to high-byte; the UART */
/* sends each low-bit to hight-bit; and the result is transmission bit */
/* by bit from highest- to lowest-order term without requiring any bit */
/* shuffling on our part. Reception works similarly. */
/* The feedback terms table consists of 256, 32-bit entries. Notes: */
/* */
/* 1. The table can be generated at runtime if desired; code to do so */
/* is shown later. It might not be obvious, but the feedback */
/* terms simply represent the results of eight shift/xor opera- */
/* tions for all combinations of data and CRC register values. */
/* */
/* 2. The CRC accumulation logic is the same for all CRC polynomials, */
/* be they sixteen or thirty-two bits wide. You simply choose the */
/* appropriate table. Alternatively, because the table can be */
/* generated at runtime, you can start by generating the table for */
/* the polynomial in question and use exactly the same "updcrc", */
/* if your application needn't simultaneously handle two CRC */
/* polynomials. (Note, however, that XMODEM is strange.) */
/* */
/* 3. For 16-bit CRCs, the table entries need be only 16 bits wide; */
/* of course, 32-bit entries work OK if the high 16 bits are zero. */
/* */
/* 4. The values must be right-shifted by eight bits by the "updcrc" */
/* logic; the shift must be unsigned (bring in zeroes). On some */
/* hardware you could probably optimize the shift in assembler by */
/* using byte-swap instructions. */
static
DWORD
calc_crc32
(
const
unsigned
char
*
buf
,
size_t
len
)
{
#define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
static
const
DWORD
crc_32_tab
[]
=
{
/* CRC polynomial 0xedb88320 */
0x00000000
,
0x77073096
,
0xee0e612c
,
0x990951ba
,
0x076dc419
,
0x706af48f
,
0xe963a535
,
0x9e6495a3
,
0x0edb8832
,
0x79dcb8a4
,
0xe0d5e91e
,
0x97d2d988
,
0x09b64c2b
,
0x7eb17cbd
,
0xe7b82d07
,
0x90bf1d91
,
0x1db71064
,
0x6ab020f2
,
0xf3b97148
,
0x84be41de
,
0x1adad47d
,
0x6ddde4eb
,
0xf4d4b551
,
0x83d385c7
,
0x136c9856
,
0x646ba8c0
,
0xfd62f97a
,
0x8a65c9ec
,
0x14015c4f
,
0x63066cd9
,
0xfa0f3d63
,
0x8d080df5
,
0x3b6e20c8
,
0x4c69105e
,
0xd56041e4
,
0xa2677172
,
0x3c03e4d1
,
0x4b04d447
,
0xd20d85fd
,
0xa50ab56b
,
0x35b5a8fa
,
0x42b2986c
,
0xdbbbc9d6
,
0xacbcf940
,
0x32d86ce3
,
0x45df5c75
,
0xdcd60dcf
,
0xabd13d59
,
0x26d930ac
,
0x51de003a
,
0xc8d75180
,
0xbfd06116
,
0x21b4f4b5
,
0x56b3c423
,
0xcfba9599
,
0xb8bda50f
,
0x2802b89e
,
0x5f058808
,
0xc60cd9b2
,
0xb10be924
,
0x2f6f7c87
,
0x58684c11
,
0xc1611dab
,
0xb6662d3d
,
0x76dc4190
,
0x01db7106
,
0x98d220bc
,
0xefd5102a
,
0x71b18589
,
0x06b6b51f
,
0x9fbfe4a5
,
0xe8b8d433
,
0x7807c9a2
,
0x0f00f934
,
0x9609a88e
,
0xe10e9818
,
0x7f6a0dbb
,
0x086d3d2d
,
0x91646c97
,
0xe6635c01
,
0x6b6b51f4
,
0x1c6c6162
,
0x856530d8
,
0xf262004e
,
0x6c0695ed
,
0x1b01a57b
,
0x8208f4c1
,
0xf50fc457
,
0x65b0d9c6
,
0x12b7e950
,
0x8bbeb8ea
,
0xfcb9887c
,
0x62dd1ddf
,
0x15da2d49
,
0x8cd37cf3
,
0xfbd44c65
,
0x4db26158
,
0x3ab551ce
,
0xa3bc0074
,
0xd4bb30e2
,
0x4adfa541
,
0x3dd895d7
,
0xa4d1c46d
,
0xd3d6f4fb
,
0x4369e96a
,
0x346ed9fc
,
0xad678846
,
0xda60b8d0
,
0x44042d73
,
0x33031de5
,
0xaa0a4c5f
,
0xdd0d7cc9
,
0x5005713c
,
0x270241aa
,
0xbe0b1010
,
0xc90c2086
,
0x5768b525
,
0x206f85b3
,
0xb966d409
,
0xce61e49f
,
0x5edef90e
,
0x29d9c998
,
0xb0d09822
,
0xc7d7a8b4
,
0x59b33d17
,
0x2eb40d81
,
0xb7bd5c3b
,
0xc0ba6cad
,
0xedb88320
,
0x9abfb3b6
,
0x03b6e20c
,
0x74b1d29a
,
0xead54739
,
0x9dd277af
,
0x04db2615
,
0x73dc1683
,
0xe3630b12
,
0x94643b84
,
0x0d6d6a3e
,
0x7a6a5aa8
,
0xe40ecf0b
,
0x9309ff9d
,
0x0a00ae27
,
0x7d079eb1
,
0xf00f9344
,
0x8708a3d2
,
0x1e01f268
,
0x6906c2fe
,
0xf762575d
,
0x806567cb
,
0x196c3671
,
0x6e6b06e7
,
0xfed41b76
,
0x89d32be0
,
0x10da7a5a
,
0x67dd4acc
,
0xf9b9df6f
,
0x8ebeeff9
,
0x17b7be43
,
0x60b08ed5
,
0xd6d6a3e8
,
0xa1d1937e
,
0x38d8c2c4
,
0x4fdff252
,
0xd1bb67f1
,
0xa6bc5767
,
0x3fb506dd
,
0x48b2364b
,
0xd80d2bda
,
0xaf0a1b4c
,
0x36034af6
,
0x41047a60
,
0xdf60efc3
,
0xa867df55
,
0x316e8eef
,
0x4669be79
,
0xcb61b38c
,
0xbc66831a
,
0x256fd2a0
,
0x5268e236
,
0xcc0c7795
,
0xbb0b4703
,
0x220216b9
,
0x5505262f
,
0xc5ba3bbe
,
0xb2bd0b28
,
0x2bb45a92
,
0x5cb36a04
,
0xc2d7ffa7
,
0xb5d0cf31
,
0x2cd99e8b
,
0x5bdeae1d
,
0x9b64c2b0
,
0xec63f226
,
0x756aa39c
,
0x026d930a
,
0x9c0906a9
,
0xeb0e363f
,
0x72076785
,
0x05005713
,
0x95bf4a82
,
0xe2b87a14
,
0x7bb12bae
,
0x0cb61b38
,
0x92d28e9b
,
0xe5d5be0d
,
0x7cdcefb7
,
0x0bdbdf21
,
0x86d3d2d4
,
0xf1d4e242
,
0x68ddb3f8
,
0x1fda836e
,
0x81be16cd
,
0xf6b9265b
,
0x6fb077e1
,
0x18b74777
,
0x88085ae6
,
0xff0f6a70
,
0x66063bca
,
0x11010b5c
,
0x8f659eff
,
0xf862ae69
,
0x616bffd3
,
0x166ccf45
,
0xa00ae278
,
0xd70dd2ee
,
0x4e048354
,
0x3903b3c2
,
0xa7672661
,
0xd06016f7
,
0x4969474d
,
0x3e6e77db
,
0xaed16a4a
,
0xd9d65adc
,
0x40df0b66
,
0x37d83bf0
,
0xa9bcae53
,
0xdebb9ec5
,
0x47b2cf7f
,
0x30b5ffe9
,
0xbdbdf21c
,
0xcabac28a
,
0x53b39330
,
0x24b4a3a6
,
0xbad03605
,
0xcdd70693
,
0x54de5729
,
0x23d967bf
,
0xb3667a2e
,
0xc4614ab8
,
0x5d681b02
,
0x2a6f2b94
,
0xb40bbe37
,
0xc30c8ea1
,
0x5a05df1b
,
0x2d02ef8d
};
size_t
i
;
DWORD
crc
=
~
0
;
for
(
i
=
0
;
i
<
len
;
i
++
)
crc
=
UPDC32
(
buf
[
i
],
crc
);
return
~
crc
;
#undef UPDC32
}
/******************************************************************
* elf_load_debug_info
* elf_load_debug_info
_from_file
*
* Loads the symbolic information from ELF module stored in 'file
name
'
* Loads the symbolic information from ELF module stored in 'file'
* the module has been loaded at 'load_offset' address, so symbols' address
* relocation is performed
* relocation is performed. crc optionally points to the CRC of the debug file
* to load.
* returns
* -1 if the file cannot be found/opened
* 0 if the file doesn't contain symbolic info (or this info cannot be
* read or parsed)
* 1 on success
*/
BOOL
elf_load_debug_info
(
struct
module
*
module
)
static
BOOL
elf_load_debug_info_from_file
(
struct
module
*
module
,
const
char
*
file
,
struct
pool
*
pool
,
struct
hash_table
*
ht_symtab
,
const
DWORD
*
crc
)
{
BOOL
ret
=
FALSE
;
char
*
addr
=
(
char
*
)
0xffffffff
;
...
...
@@ -481,9 +601,7 @@ BOOL elf_load_debug_info(struct module* module)
const
Elf32_Shdr
*
spnt
;
const
char
*
shstrtab
;
int
i
;
int
symtab_sect
,
dynsym_sect
,
stab_sect
,
stabstr_sect
,
debug_sect
;
struct
pool
pool
;
struct
hash_table
ht_symtab
;
int
symtab_sect
,
dynsym_sect
,
stab_sect
,
stabstr_sect
,
debug_sect
,
debuglink_sect
;
struct
thunk_area
thunks
[]
=
{
{
"__wine_spec_import_thunks"
,
THUNK_ORDINAL_NOTYPE
,
0
,
0
},
/* inter DLL calls */
...
...
@@ -502,15 +620,15 @@ BOOL elf_load_debug_info(struct module* module)
return
FALSE
;
}
TRACE
(
"%s
\n
"
,
module
->
module
.
LoadedImageNam
e
);
TRACE
(
"%s
\n
"
,
fil
e
);
/* check that the file exists, and that the module hasn't been loaded yet */
if
(
stat
(
module
->
module
.
LoadedImageNam
e
,
&
statbuf
)
==
-
1
)
goto
leave
;
if
(
stat
(
fil
e
,
&
statbuf
)
==
-
1
)
goto
leave
;
if
(
S_ISDIR
(
statbuf
.
st_mode
))
goto
leave
;
/*
* Now open the file, so that we can mmap() it.
*/
if
((
fd
=
open
(
module
->
module
.
LoadedImageNam
e
,
O_RDONLY
))
==
-
1
)
goto
leave
;
if
((
fd
=
open
(
fil
e
,
O_RDONLY
))
==
-
1
)
goto
leave
;
/*
* Now mmap() the file.
...
...
@@ -518,6 +636,13 @@ BOOL elf_load_debug_info(struct module* module)
addr
=
mmap
(
0
,
statbuf
.
st_size
,
PROT_READ
,
MAP_PRIVATE
,
fd
,
0
);
if
(
addr
==
(
char
*
)
0xffffffff
)
goto
leave
;
if
(
crc
&&
(
*
crc
!=
calc_crc32
(
addr
,
statbuf
.
st_size
)))
{
ERR
(
"Bad CRC for file %s
\n
"
,
file
);
/* we don't tolerate mis-matched files */
goto
leave
;
}
/*
* Next, we need to find a few of the internal ELF headers within
* this thing. We need the main executable header, and the section
...
...
@@ -527,7 +652,7 @@ BOOL elf_load_debug_info(struct module* module)
spnt
=
(
Elf32_Shdr
*
)(
addr
+
ehptr
->
e_shoff
);
shstrtab
=
(
addr
+
spnt
[
ehptr
->
e_shstrndx
].
sh_offset
);
symtab_sect
=
dynsym_sect
=
stab_sect
=
stabstr_sect
=
debug_sect
=
-
1
;
symtab_sect
=
dynsym_sect
=
stab_sect
=
stabstr_sect
=
debug_sect
=
debuglink_sect
=
-
1
;
for
(
i
=
0
;
i
<
ehptr
->
e_shnum
;
i
++
)
{
...
...
@@ -537,6 +662,8 @@ BOOL elf_load_debug_info(struct module* module)
stabstr_sect
=
i
;
if
(
strcmp
(
shstrtab
+
spnt
[
i
].
sh_name
,
".debug_info"
)
==
0
)
debug_sect
=
i
;
if
(
strcmp
(
shstrtab
+
spnt
[
i
].
sh_name
,
".gnu_debuglink"
)
==
0
)
debuglink_sect
=
i
;
if
((
strcmp
(
shstrtab
+
spnt
[
i
].
sh_name
,
".symtab"
)
==
0
)
&&
(
spnt
[
i
].
sh_type
==
SHT_SYMTAB
))
symtab_sect
=
i
;
...
...
@@ -556,12 +683,9 @@ BOOL elf_load_debug_info(struct module* module)
}
module
->
module
.
SymType
=
SymExport
;
/* FIXME: guess a better size from ELF info */
pool_init
(
&
pool
,
65536
);
hash_table_init
(
&
pool
,
&
ht_symtab
,
256
);
/* create a hash table for the symtab */
elf_hash_symtab
(
module
,
&
pool
,
&
ht_symtab
,
addr
,
elf_hash_symtab
(
module
,
pool
,
ht_symtab
,
addr
,
spnt
+
symtab_sect
,
spnt
+
spnt
[
symtab_sect
].
sh_link
,
sizeof
(
thunks
)
/
sizeof
(
thunks
[
0
]),
thunks
);
...
...
@@ -580,26 +704,35 @@ BOOL elf_load_debug_info(struct module* module)
goto
leave
;
}
/* and fill in the missing information for stabs */
elf_finish_stabs_info
(
module
,
&
ht_symtab
);
elf_finish_stabs_info
(
module
,
ht_symtab
);
}
else
if
(
debug_sect
!=
-
1
)
{
/* Dwarf 2 debug information */
FIXME
(
"Unsupported Dwarf2 information for %s
\n
"
,
module
->
module
.
ModuleName
);
}
else
if
(
debuglink_sect
!=
-
1
)
{
DWORD
crc
;
const
char
*
file
=
(
const
char
*
)(
addr
+
spnt
[
debuglink_sect
].
sh_offset
);
/* crc is stored after the null terminated file string rounded
* up to the next 4 byte boundary */
crc
=
*
(
const
DWORD
*
)(
file
+
((
DWORD_PTR
)(
strlen
(
file
)
+
4
)
&
~
3
));
ret
=
elf_load_debug_info_from_file
(
module
,
file
,
pool
,
ht_symtab
,
&
crc
);
if
(
!
ret
)
WARN
(
"Couldn't load linked debug file %s
\n
"
,
file
);
}
}
if
(
strstr
(
module
->
module
.
ModuleName
,
"<elf>"
)
||
!
strcmp
(
module
->
module
.
ModuleName
,
"<wine-loader>"
))
{
/* add the thunks for native libraries */
if
(
!
(
dbghelp_options
&
SYMOPT_PUBLICS_ONLY
))
elf_new_wine_thunks
(
module
,
&
ht_symtab
,
elf_new_wine_thunks
(
module
,
ht_symtab
,
sizeof
(
thunks
)
/
sizeof
(
thunks
[
0
]),
thunks
);
}
/* add all the public symbols from symtab */
if
(
elf_new_public_symbols
(
module
,
&
ht_symtab
)
&&
!
ret
)
ret
=
TRUE
;
pool_destroy
(
&
pool
);
if
(
elf_new_public_symbols
(
module
,
ht_symtab
)
&&
!
ret
)
ret
=
TRUE
;
leave:
if
(
addr
!=
(
char
*
)
0xffffffff
)
munmap
(
addr
,
statbuf
.
st_size
);
...
...
@@ -609,6 +742,29 @@ leave:
}
/******************************************************************
* elf_load_debug_info
*
* Loads ELF debugging information from the module image file.
*/
BOOL
elf_load_debug_info
(
struct
module
*
module
)
{
BOOL
ret
;
struct
pool
pool
;
struct
hash_table
ht_symtab
;
pool_init
(
&
pool
,
65536
);
hash_table_init
(
&
pool
,
&
ht_symtab
,
256
);
ret
=
elf_load_debug_info_from_file
(
module
,
module
->
module
.
LoadedImageName
,
&
pool
,
&
ht_symtab
,
NULL
);
pool_destroy
(
&
pool
);
return
ret
;
}
/******************************************************************
* is_dt_flag_valid
* returns true iff the section tag is valid
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment