1
- /* $VER: vlink elf.c V0.15d (19.01 .17)
1
+ /* $VER: vlink elf.c V0.15e (23.03 .17)
2
2
*
3
3
* This file is part of vlink, a portable linker for multiple
4
4
* object formats.
5
5
* Copyright (c) 1997-2017 Frank Wille
6
- *
7
- * vlink is freeware and part of the portable and retargetable ANSI C
8
- * compiler vbcc, copyright (c) 1995-2017 by Volker Barthelmann.
9
- * vlink may be freely redistributed as long as no modifications are
10
- * made and nothing is charged for it. Non-commercial usage is allowed
11
- * without any restrictions.
12
- * EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
13
- * SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
14
6
*/
15
7
16
8
@@ -120,12 +112,16 @@ int elf_identify(struct FFFuncs *ff,char *name,void *p,
120
112
case ET_REL :
121
113
return arflag ? ID_LIBARCH : ID_OBJECT ;
122
114
case ET_EXEC :
123
- if (arflag ) /* no executables in library archives */
115
+ if (arflag ) { /* no executables in library archives */
124
116
error (40 ,name ,ff -> tname );
117
+ return ID_UNKNOWN ;
118
+ }
125
119
return ID_EXECUTABLE ;
126
120
case ET_DYN :
127
- if (arflag ) /* no shared objects in library archives */
121
+ if (arflag ) { /* no shared objects in library archives */
128
122
error (39 ,name ,ff -> tname );
123
+ return ID_UNKNOWN ;
124
+ }
129
125
return ID_SHAREDOBJ ;
130
126
default :
131
127
error (41 ,name ,ff -> tname ); /* illegal fmt. / file corrupted */
@@ -138,13 +134,14 @@ int elf_identify(struct FFFuncs *ff,char *name,void *p,
138
134
}
139
135
140
136
141
- void elf_check_ar_type (struct FFFuncs * ff ,const char * name ,void * p ,
137
+ bool elf_check_ar_type (struct FFFuncs * ff ,const char * name ,void * p ,
142
138
unsigned char class ,unsigned char endian ,
143
139
uint32_t ver ,int nmach ,...)
144
140
/* check all library archive members before conversion */
145
141
{
146
142
struct Elf_CommonHdr * ehdr = (struct Elf_CommonHdr * )p ;
147
143
bool be = (endian == ELFDATA2MSB );
144
+ bool valid = TRUE;
148
145
uint16_t m = read16 (be ,ehdr -> e_machine );
149
146
va_list vl ;
150
147
@@ -174,10 +171,11 @@ void elf_check_ar_type(struct FFFuncs *ff,const char *name,void *p,
174
171
}
175
172
}
176
173
}
177
- error ( 41 , name , ff -> tname ) ;
174
+ valid = FALSE ;
178
175
179
176
check_ar_exit :
180
177
va_end (vl );
178
+ return valid ;
181
179
}
182
180
183
181
0 commit comments