/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
int * dlopen(int param_1,uint param_2)
{
bool bVar1;
char *pcVar2;
int iVar3;
int *piVar4;
undefined1 *puVar5;
undefined4 *puVar6;
void *pvVar7;
int *piVar8;
uint uVar9;
int iVar10;
undefined4 *puVar11;
uint uVar12;
int iVar13;
int iVar14;
undefined4 *puVar15;
undefined4 *puVar16;
undefined4 *puVar17;
int *piVar18;
code *pcVar19;
undefined1 *puVar20;
uint unaff_retaddr;
undefined1 auStack_78 [24];
undefined4 local_60;
int local_5c;
undefined4 local_58;
int *local_48 [2];
uint local_40;
uint local_3c;
int *local_38;
uint local_34;
int **local_30;
if ((param_2 & 3) == 0) {
__dl_error_number = 9;
}
else {
if (DAT_00022070 == '\0') {
DAT_00022070 = '\x01';
__dl_malloc_function = malloc;
__dl_free_function = free;
}
if (param_1 == 0) {
return __dl_symbol_tables;
}
piVar8 = __dl_symbol_tables;
iVar3 = 0;
while (piVar4 = __dl_symbol_tables, piVar8 != (int *)0x0) {
iVar10 = *piVar8;
uVar9 = *(uint *)(iVar10 + 0x14);
if (uVar9 < unaff_retaddr) {
if ((iVar3 == 0) || (*(uint *)(iVar3 + 0x14) < uVar9)) {
piVar8 = (int *)piVar8[4];
iVar3 = iVar10;
}
else {
piVar8 = (int *)piVar8[4];
}
}
else {
piVar8 = (int *)piVar8[4];
}
}
do {
local_48[0] = piVar4;
local_38 = local_48[0];
if (local_48[0] == (int *)0x0) break;
piVar4 = (int *)local_48[0][4];
} while ((int *)local_48[0][4] != (int *)0x0);
pcVar2 = getenv((char *)0x172c) //possible issue identified - semgrep
local_3c = 2;
if (pcVar2 == (char *)0x0) {
local_3c = param_2 & 2;
}
local_58 = 0;
iVar3 = _dl_load_shared_library(0,local_48,iVar3,param_1);
if (iVar3 == 0) {
return (int *)0x0;
}
piVar4 = (int *)malloc(0x18) //possible issue identified - semgrep
iVar10 = 0x18;
piVar8 = piVar4;
while (bVar1 = iVar10 != 0, iVar10 = iVar10 + -1, bVar1) {
*(undefined1 *)piVar8 = 0;
piVar8 = (int *)((int)piVar8 + 1);
}
*piVar4 = iVar3;
local_34 = param_2 & 4;
*(uint *)(iVar3 + 0x24) = *(uint *)(iVar3 + 0x24) | local_34;
piVar8 = __dl_handles;
piVar18 = piVar4;
piVar4[1] = (int)__dl_handles;
__dl_handles = piVar18;
if (1 < *(ushort *)(iVar3 + 0x20)) {
while( true ) {
if (piVar8 == (int *)0x0) {
return piVar4;
}
if (*piVar8 == iVar3) break;
piVar8 = (int *)piVar8[1];
}
iVar3 = piVar8[3];
piVar4[2] = piVar8[2];
piVar4[3] = iVar3;
uVar9 = 0;
while( true ) {
iVar3 = uVar9 * 4;
bVar1 = (uint)piVar4[3] <= uVar9;
uVar9 = uVar9 + 1;
if (bVar1) break;
iVar3 = *(int *)(piVar4[2] + iVar3);
*(uint *)(iVar3 + 0x24) = *(uint *)(iVar3 + 0x24) | local_34;
}
piVar4[4] = piVar8[4];
return piVar4;
}
puVar20 = auStack_78;
puVar15 = &local_60;
*(ushort *)(iVar3 + 0x22) = *(ushort *)(iVar3 + 0x22) | 0x10;
local_5c = iVar3;
local_60 = 0;
local_40 = 0;
local_30 = local_48;
puVar17 = puVar15;
piVar8 = piVar4;
puVar16 = puVar15;
while (puVar17 != (undefined4 *)0x0) {
*(undefined4 *)(puVar17[1] + 0x30) = 0;
for (piVar18 = *(int **)(puVar17[1] + 8); *piVar18 != 0; piVar18 = piVar18 + 2) {
puVar6 = puVar16;
puVar5 = puVar20;
if (*piVar18 == 1) {
iVar13 = puVar17[1];
iVar10 = piVar18[1];
iVar14 = *(int *)(iVar13 + 0x54);
*(undefined4 *)(puVar20 + 0x10) = 0;
iVar10 = _dl_load_shared_library(0,local_30,iVar13,iVar10 + iVar14);
if (iVar10 == 0) goto LAB_000115c8;
*(uint *)(iVar10 + 0x24) = *(uint *)(iVar10 + 0x24) | local_34;
puVar5 = (undefined1 *)malloc(0x18) //possible issue identified - semgrep
iVar13 = 0x18;
piVar8[4] = (int)puVar5;
while (bVar1 = iVar13 != 0, iVar13 = iVar13 + -1, bVar1) {
*puVar5 = 0;
puVar5 = puVar5 + 1;
}
piVar8 = (int *)piVar8[4];
puVar5 = puVar20 + -0x10;
*piVar8 = iVar10;
*(int *)(puVar20 + 0xc) = iVar10;
iVar13 = puVar17[1];
*(undefined4 *)(puVar20 + 8) = *(undefined4 *)(iVar13 + 0x30);
*(undefined1 **)(iVar13 + 0x30) = puVar20 + 8;
for (puVar11 = puVar15; puVar11 != (undefined4 *)0x0; puVar11 = (undefined4 *)*puVar11) {
if (iVar10 == puVar11[1]) {
*(short *)(iVar10 + 0x20) = *(short *)(iVar10 + 0x20) + -1;
goto LAB_00011318;
}
}
puVar5 = puVar20 + -0x20;
puVar6 = (undefined4 *)(puVar20 + -8);
*puVar16 = puVar6;
*(int *)(puVar20 + -4) = iVar10;
*puVar6 = 0;
}
LAB_00011318:
puVar16 = puVar6;
puVar20 = puVar5;
}
puVar17 = (undefined4 *)*puVar17;
local_40 = local_40 + 1;
}
pvVar7 = malloc(local_40 << 2) //possible issue identified - semgrep
piVar4[2] = (int)pvVar7;
piVar4[3] = local_40;
iVar10 = 0;
for (puVar17 = puVar15; puVar17 != (undefined4 *)0x0; puVar17 = (undefined4 *)*puVar17) {
*(undefined4 *)((int)pvVar7 + iVar10 * 4) = puVar17[1];
puVar16 = *(undefined4 **)(puVar17[1] + 0x30);
while (puVar16 != (undefined4 *)0x0) {
if ((*(uint *)(puVar16[1] + 0x24) & 4) == 0) {
puVar6 = (undefined4 *)malloc(8) //possible issue identified - semgrep
puVar6[1] = puVar16[1];
iVar13 = puVar17[1];
*puVar6 = *(undefined4 *)(iVar13 + 0x34);
*(undefined4 **)(iVar13 + 0x34) = puVar6;
puVar16 = (undefined4 *)*puVar16;
}
else {
puVar16 = (undefined4 *)*puVar16;
}
}
iVar10 = iVar10 + 1;
}
for (; uVar9 = 0, puVar15 != (undefined4 *)0x0; puVar15 = (undefined4 *)*puVar15) {
do {
uVar12 = uVar9;
uVar9 = uVar12 + 1;
} while (*(int *)((int)pvVar7 + uVar12 * 4) != puVar15[1]);
for (; uVar9 < local_40; uVar9 = uVar9 + 1) {
iVar10 = *(int *)((int)pvVar7 + uVar9 * 4);
puVar17 = *(undefined4 **)(iVar10 + 0x30);
while( true ) {
if (puVar17 == (undefined4 *)0x0) goto LAB_0001147c;
if (puVar17[1] == puVar15[1]) break;
puVar17 = (undefined4 *)*puVar17;
}
iVar13 = uVar9 - uVar12;
while( true ) {
iVar14 = iVar13 + uVar12;
if (iVar13 == 0) break;
iVar13 = iVar13 + -1;
*(undefined4 *)((int)pvVar7 + iVar14 * 4) =
*(undefined4 *)((1 - iVar14) * -4 + (int)pvVar7);
}
*(int *)((int)pvVar7 + uVar12 * 4) = iVar10;
uVar12 = uVar12 + 1;
LAB_0001147c:
}
}
_dl_perform_mips_global_got_relocations(iVar3,local_3c == 0);
iVar3 = _dl_fixup(piVar4,local_3c);
if (iVar3 == 0) {
if (local_38 != (int *)0x0) {
for (local_48[0] = (int *)local_38[4]; local_48[0] != (int *)0x0;
local_48[0] = (int *)local_48[0][4]) {
if (*(int *)(*local_48[0] + 0xe4) != 0) {
_dl_protect_relro();
}
}
local_48[0] = (int *)0x0;
}
uVar9 = local_40;
if ((__dl_debug_addr != 0) &&
(pcVar19 = *(code **)(__dl_debug_addr + 8), pcVar19 != (code *)0x0)) {
*(undefined4 *)(__dl_debug_addr + 0xc) = 1;
(*pcVar19)();
*(undefined4 *)(__dl_debug_addr + 0xc) = 0;
(*pcVar19)();
uVar9 = local_40;
}
while (uVar9 != 0) {
piVar8 = *(int **)((1 - uVar9) * -4 + (int)pvVar7);
uVar9 = uVar9 - 1;
if ((*(ushort *)((int)piVar8 + 0x22) & 4) == 0) {
*(ushort *)((int)piVar8 + 0x22) = *(ushort *)((int)piVar8 + 0x22) | 4;
if ((piVar8[0x1c] != 0) &&
(pcVar19 = (code *)(piVar8[0x1c] + *piVar8), pcVar19 != (code *)0x0)) {
(*pcVar19)();
}
_dl_run_init_array(piVar8);
}
}
return piVar4;
}
LAB_000115c8:
(*(code *)0xad4)(piVar4,0);
}
return (int *)0x0;
}