LINUX.ORG.RU

История изменений

Исправление EXL, (текущая версия) :

Большое спасибо! Мне тут в местном чате Azq2 подсказал похожее решение проблемы:

typedef __builtin_va_list *va_list;

#define va_start(a, b)       { __builtin_va_list tmp; __builtin_va_start(tmp, b); a = &tmp; }
#define va_end(a)            __builtin_va_end(*a)

В итоге оно компилируется в такое и всё работает:

109018f4 <UtilLogStringData>:
109018f4:	b40f      	push	{r0, r1, r2, r3}
109018f6:	b510      	push	{r4, lr}
109018f8:	b0c4      	sub	sp, #272	; 0x110
109018fa:	ab46      	add	r3, sp, #280	; 0x118
109018fc:	cb02      	ldmia	r3!, {r1}
109018fe:	ac04      	add	r4, sp, #16
10901900:	aa03      	add	r2, sp, #12
10901902:	0020      	movs	r0, r4
10901904:	9303      	str	r3, [sp, #12]
10901906:	f765 fdff 	bl	10867508 <vsprintf>
1090190a:	0020      	movs	r0, r4
1090190c:	f765 fd7c 	bl	10867408 <strlen>
10901910:	2201      	movs	r2, #1
10901912:	1c43      	adds	r3, r0, #1
10901914:	9400      	str	r4, [sp, #0]
10901916:	2000      	movs	r0, #0
10901918:	4903      	ldr	r1, [pc, #12]	; (10901928 <UtilLogStringData+0x34>)
1090191a:	f491 fd93 	bl	10593444 <suLogData>
1090191e:	b044      	add	sp, #272	; 0x110
10901920:	bc10      	pop	{r4}
10901922:	bc08      	pop	{r3}
10901924:	b004      	add	sp, #16
10901926:	4718      	bx	r3
10901928:	00005151 	andeq	r5, r0, r1, asr r1

И теперь я могу полностью выкинуть древний проприетарный ARM ADS, который даже не может скомпилировать такое:

UINT32 LdrLoadELF_AUX(W_CHAR *uri, W_CHAR *params) {
	UINT32 status;

	status = RESULT_OK;

	LdrLoadELF(uri, params);

	// "ElfLoader.c", line 461: Serious error: C2292E: typedef name 'UINT32' used in expression context
	// "ElfLoader.c", line 461: Serious error: C2284E: expected ';' after command - inserted before 'var'
	// "ElfLoader.c", line 461: Error: C2456E: undeclared name, inventing 'extern int var'
	// ElfLoader.c: 0 warnings, 1 error, 2 serious errors

	UINT32 var = 1;

	return status;
}

Исправление EXL, :

Большое спасибо! Мне тут в местном чате Azq2 подсказал похожее решение проблемы:

typedef __builtin_va_list *va_list;

#define va_start(a, b)       { __builtin_va_list tmp; __builtin_va_start(tmp, b); a = &tmp; }
#define va_end(a)            __builtin_va_end(*a)

В итоге оно компилируется в такое:

109018f4 <UtilLogStringData>:
109018f4:	b40f      	push	{r0, r1, r2, r3}
109018f6:	b510      	push	{r4, lr}
109018f8:	b0c4      	sub	sp, #272	; 0x110
109018fa:	ab46      	add	r3, sp, #280	; 0x118
109018fc:	cb02      	ldmia	r3!, {r1}
109018fe:	ac04      	add	r4, sp, #16
10901900:	aa03      	add	r2, sp, #12
10901902:	0020      	movs	r0, r4
10901904:	9303      	str	r3, [sp, #12]
10901906:	f765 fdff 	bl	10867508 <vsprintf>
1090190a:	0020      	movs	r0, r4
1090190c:	f765 fd7c 	bl	10867408 <strlen>
10901910:	2201      	movs	r2, #1
10901912:	1c43      	adds	r3, r0, #1
10901914:	9400      	str	r4, [sp, #0]
10901916:	2000      	movs	r0, #0
10901918:	4903      	ldr	r1, [pc, #12]	; (10901928 <UtilLogStringData+0x34>)
1090191a:	f491 fd93 	bl	10593444 <suLogData>
1090191e:	b044      	add	sp, #272	; 0x110
10901920:	bc10      	pop	{r4}
10901922:	bc08      	pop	{r3}
10901924:	b004      	add	sp, #16
10901926:	4718      	bx	r3
10901928:	00005151 	andeq	r5, r0, r1, asr r1

И теперь я могу полностью выкинуть древний проприетарный ARM ADS, который даже не может скомпилировать такое:

UINT32 LdrLoadELF_AUX(W_CHAR *uri, W_CHAR *params) {
	UINT32 status;

	status = RESULT_OK;

	LdrLoadELF(uri, params);

	// "ElfLoader.c", line 461: Serious error: C2292E: typedef name 'UINT32' used in expression context
	// "ElfLoader.c", line 461: Serious error: C2284E: expected ';' after command - inserted before 'var'
	// "ElfLoader.c", line 461: Error: C2456E: undeclared name, inventing 'extern int var'
	// ElfLoader.c: 0 warnings, 1 error, 2 serious errors

	UINT32 var = 1;

	return status;
}

Исходная версия EXL, :

Большое спасибо! Мне тут в чате Azq2 подсказал похожее решение проблемы:

typedef __builtin_va_list *va_list;

#define va_start(a, b)       { __builtin_va_list tmp; __builtin_va_start(tmp, b); a = &tmp; }
#define va_end(a)            __builtin_va_end(*a)

В итоге оно компилируется в такое:

109018f4 <UtilLogStringData>:
109018f4:	b40f      	push	{r0, r1, r2, r3}
109018f6:	b510      	push	{r4, lr}
109018f8:	b0c4      	sub	sp, #272	; 0x110
109018fa:	ab46      	add	r3, sp, #280	; 0x118
109018fc:	cb02      	ldmia	r3!, {r1}
109018fe:	ac04      	add	r4, sp, #16
10901900:	aa03      	add	r2, sp, #12
10901902:	0020      	movs	r0, r4
10901904:	9303      	str	r3, [sp, #12]
10901906:	f765 fdff 	bl	10867508 <vsprintf>
1090190a:	0020      	movs	r0, r4
1090190c:	f765 fd7c 	bl	10867408 <strlen>
10901910:	2201      	movs	r2, #1
10901912:	1c43      	adds	r3, r0, #1
10901914:	9400      	str	r4, [sp, #0]
10901916:	2000      	movs	r0, #0
10901918:	4903      	ldr	r1, [pc, #12]	; (10901928 <UtilLogStringData+0x34>)
1090191a:	f491 fd93 	bl	10593444 <suLogData>
1090191e:	b044      	add	sp, #272	; 0x110
10901920:	bc10      	pop	{r4}
10901922:	bc08      	pop	{r3}
10901924:	b004      	add	sp, #16
10901926:	4718      	bx	r3
10901928:	00005151 	andeq	r5, r0, r1, asr r1

И теперь я могу полностью выкинуть древний проприетарный ARM ADS, который даже не может скомпилировать такое:

UINT32 LdrLoadELF_AUX(W_CHAR *uri, W_CHAR *params) {
	UINT32 status;

	status = RESULT_OK;

	LdrLoadELF(uri, params);

	// "ElfLoader.c", line 461: Serious error: C2292E: typedef name 'UINT32' used in expression context
	// "ElfLoader.c", line 461: Serious error: C2284E: expected ';' after command - inserted before 'var'
	// "ElfLoader.c", line 461: Error: C2456E: undeclared name, inventing 'extern int var'
	// ElfLoader.c: 0 warnings, 1 error, 2 serious errors

	UINT32 var = 1;

	return status;
}