Skip to content

Commit f12e0b1

Browse files
fix(win32): use dllexport/dllimport to avoid generate wrong 32 bits pesudo relocations
--export-all-symbols can't deal with this issue. fix estkme-group#424 Signed-off-by: Coelacanthus <uwu@coelacanthus.name>
1 parent c0f585f commit f12e0b1

22 files changed

Lines changed: 206 additions & 154 deletions

cjson-ext/cjson-ext/cJSON_ex.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "cJSON_ex.h"
22

3-
inline cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name, const char *const string) {
3+
cJSON *cJSON_AddStringOrNullToObject(cJSON *const object, const char *const name,
4+
const char *const string) {
45
if (string) {
56
return cJSON_AddStringToObject(object, name, string);
67
} else {

driver/CMakeLists.txt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ target_sources(
2222
)
2323

2424
add_library(euicc-driver-loader SHARED)
25+
target_compile_definitions(euicc-driver-loader PRIVATE DRIVER_EXPORTS)
2526
target_link_libraries(euicc-driver-loader PRIVATE euicc euicc-drivers ${DL_LIBRARY} ${CJSON_LIBRARY} lpac-utils)
2627
target_sources(
2728
euicc-driver-loader
@@ -38,11 +39,6 @@ target_sources(
3839
euicc-driver-loader.h
3940
)
4041

41-
# Only useful on Windows, and will lead to invalid arguments on ld.gold.
42-
if(WIN32)
43-
target_link_options(euicc-driver-loader PRIVATE "LINKER:--export-all-symbols")
44-
endif()
45-
4642
add_library(driver_apdu_stdio SHARED apdu/stdio.c)
4743
target_link_libraries(driver_apdu_stdio PRIVATE euicc euicc-drivers lpac-utils)
4844
set_target_properties(driver_apdu_stdio PROPERTIES PREFIX "")

driver/driver.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
# undef interface
55
#endif
66

7+
#if defined(_WIN32)
8+
# ifdef DRIVER_EXPORTS
9+
# define DRIVER_API __declspec(dllexport)
10+
# else
11+
# define DRIVER_API __declspec(dllimport)
12+
# endif
13+
#else
14+
# define DRIVER_API
15+
#endif
16+
717
enum euicc_driver_type {
818
DRIVER_APDU,
919
DRIVER_HTTP,

driver/euicc-driver-loader.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Needed by dlinfo(3).
22
#define _GNU_SOURCE
3-
#include "driver.h"
3+
4+
#include "euicc-driver-loader.h"
45

56
#include <lpac/list.h>
67
#include <lpac/utils.h>
@@ -38,8 +39,8 @@
3839
static const struct euicc_driver *_driver_apdu = NULL;
3940
static const struct euicc_driver *_driver_http = NULL;
4041

41-
struct euicc_apdu_interface euicc_driver_interface_apdu;
42-
struct euicc_http_interface euicc_driver_interface_http;
42+
DRIVER_API struct euicc_apdu_interface euicc_driver_interface_apdu;
43+
DRIVER_API struct euicc_http_interface euicc_driver_interface_http;
4344

4445
struct euicc_drivers_list {
4546
const struct euicc_driver *driver;
@@ -350,7 +351,7 @@ static inline const struct euicc_driver *find_driver(const enum euicc_driver_typ
350351
}
351352
}
352353

353-
int euicc_driver_list(int argc, char **argv) {
354+
DRIVER_API int euicc_driver_list(int argc, char **argv) {
354355
if (!init_driver_list()) {
355356
fputs("Driver list initialization failed.\n", stderr);
356357
return -1;
@@ -383,7 +384,7 @@ int euicc_driver_list(int argc, char **argv) {
383384
return 0;
384385
}
385386

386-
int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name) {
387+
DRIVER_API int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name) {
387388
_driver_apdu = find_driver(DRIVER_APDU, apdu_driver_name);
388389
if (_driver_apdu == NULL) {
389390
fprintf(stderr, "No APDU driver found\n");
@@ -409,7 +410,7 @@ int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name
409410
return 0;
410411
}
411412

412-
void euicc_driver_fini() {
413+
DRIVER_API void euicc_driver_fini() {
413414
if (_driver_apdu != NULL && _driver_apdu->fini != NULL) {
414415
_driver_apdu->fini(&euicc_driver_interface_apdu);
415416
}
@@ -418,7 +419,7 @@ void euicc_driver_fini() {
418419
}
419420
}
420421

421-
int euicc_driver_main_apdu(const int argc, char **argv) {
422+
DRIVER_API int euicc_driver_main_apdu(const int argc, char **argv) {
422423
if (_driver_apdu == NULL) {
423424
fprintf(stderr, "No APDU driver found\n");
424425
return -1;
@@ -430,7 +431,7 @@ int euicc_driver_main_apdu(const int argc, char **argv) {
430431
return _driver_apdu->main(&euicc_driver_interface_apdu, argc, argv);
431432
}
432433

433-
int euicc_driver_main_http(const int argc, char **argv) {
434+
DRIVER_API int euicc_driver_main_http(const int argc, char **argv) {
434435
if (_driver_http == NULL) {
435436
fprintf(stderr, "No HTTP driver found\n");
436437
return -1;

driver/euicc-driver-loader.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
#pragma once
22

3+
#include "driver.h"
34
#include <euicc/interface.h>
45

56
#include <inttypes.h>
67
#include <stddef.h>
78

8-
extern struct euicc_apdu_interface euicc_driver_interface_apdu;
9-
extern struct euicc_http_interface euicc_driver_interface_http;
9+
extern DRIVER_API struct euicc_apdu_interface euicc_driver_interface_apdu;
10+
extern DRIVER_API struct euicc_http_interface euicc_driver_interface_http;
1011

11-
int euicc_driver_list(int argc, char **argv);
12-
int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name);
13-
void euicc_driver_fini(void);
12+
DRIVER_API int euicc_driver_list(int argc, char **argv);
13+
DRIVER_API int euicc_driver_init(const char *apdu_driver_name, const char *http_driver_name);
14+
DRIVER_API void euicc_driver_fini(void);
1415

15-
extern int euicc_driver_main_apdu(int argc, char **argv);
16-
extern int euicc_driver_main_http(int argc, char **argv);
16+
DRIVER_API int euicc_driver_main_apdu(int argc, char **argv);
17+
DRIVER_API int euicc_driver_main_http(int argc, char **argv);

euicc/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ option(LIBEUICC_REDUCED_STDLIB_CALL "Reduce standard library calling" OFF)
22

33
if(LPAC_DYNAMIC_LIBEUICC)
44
add_library(euicc SHARED)
5+
target_compile_definitions(euicc PRIVATE LIBEUICC_EXPORTS)
56
else()
67
add_library(euicc STATIC)
78
endif()
@@ -55,6 +56,7 @@ target_sources(
5556
es10a.h
5657
es10c.h
5758
euicc.h
59+
euicc_export.h
5860
hexutil.h
5961
sha256.h
6062

@@ -68,10 +70,6 @@ set_target_properties(euicc PROPERTIES
6870
C_EXTENSIONS ON
6971
)
7072
if(LPAC_DYNAMIC_LIBEUICC)
71-
# Only useful on Windows, and will lead to invalid arguments on ld.gold.
72-
if(WIN32)
73-
target_link_options(euicc PRIVATE "LINKER:--export-all-symbols")
74-
endif()
7573
if (NOT STANDALONE_MODE)
7674
# Install a pkg-config file
7775
configure_file(libeuicc.pc.in libeuicc.pc @ONLY)

euicc/base64.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#pragma once
22

3-
int euicc_base64_decode_len(const char *bufcoded);
4-
int euicc_base64_decode(unsigned char *bufplain, const char *bufcoded);
5-
int euicc_base64_encode_len(int len);
6-
int euicc_base64_encode(char *encoded, const unsigned char *string, int len);
3+
#include "euicc_export.h"
4+
5+
EUICC_API int euicc_base64_decode_len(const char *bufcoded);
6+
EUICC_API int euicc_base64_decode(unsigned char *bufplain, const char *bufcoded);
7+
EUICC_API int euicc_base64_encode_len(int len);
8+
EUICC_API int euicc_base64_encode(char *encoded, const unsigned char *string, int len);

euicc/derutil.h

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include "euicc_export.h"
23

34
#include <inttypes.h>
45

@@ -18,20 +19,22 @@ struct euicc_derutil_node {
1819
} pack;
1920
};
2021

21-
int euicc_derutil_unpack_first(struct euicc_derutil_node *result, const uint8_t *buffer, uint32_t buffer_len);
22-
int euicc_derutil_unpack_next(struct euicc_derutil_node *result, struct euicc_derutil_node *prev, const uint8_t *buffer,
23-
uint32_t buffer_len);
24-
int euicc_derutil_unpack_find_alias_tags(struct euicc_derutil_node *result, const uint16_t *tags, uint32_t tags_count,
25-
const uint8_t *buffer, uint32_t buffer_len);
26-
int euicc_derutil_unpack_find_tag(struct euicc_derutil_node *result, uint16_t tag, const uint8_t *buffer,
27-
uint32_t buffer_len);
22+
EUICC_API int euicc_derutil_unpack_first(struct euicc_derutil_node *result, const uint8_t *buffer, uint32_t buffer_len);
23+
EUICC_API int euicc_derutil_unpack_next(struct euicc_derutil_node *result, struct euicc_derutil_node *prev,
24+
const uint8_t *buffer, uint32_t buffer_len);
25+
EUICC_API int euicc_derutil_unpack_find_alias_tags(struct euicc_derutil_node *result, const uint16_t *tags,
26+
uint32_t tags_count, const uint8_t *buffer, uint32_t buffer_len);
27+
EUICC_API int euicc_derutil_unpack_find_tag(struct euicc_derutil_node *result, uint16_t tag, const uint8_t *buffer,
28+
uint32_t buffer_len);
2829

29-
int euicc_derutil_pack(uint8_t *buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
30-
int euicc_derutil_pack_alloc(uint8_t **buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
30+
EUICC_API int euicc_derutil_pack(uint8_t *buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
31+
EUICC_API int euicc_derutil_pack_alloc(uint8_t **buffer, uint32_t *buffer_len, struct euicc_derutil_node *node);
3132

32-
long euicc_derutil_convert_bin2long(const uint8_t *buffer, uint32_t buffer_len);
33-
int euicc_derutil_convert_long2bin(uint8_t *buffer, uint32_t *buffer_len, long value);
34-
int euicc_derutil_convert_bits2bin(uint8_t *buffer, uint32_t buffer_len, const uint32_t *bits, uint32_t bits_count);
35-
int euicc_derutil_convert_bits2bin_alloc(uint8_t **buffer, uint32_t *buffer_len, const uint32_t *bits,
36-
uint32_t bits_count);
37-
int euicc_derutil_convert_bin2bits_str(const char ***output, const uint8_t *buffer, int buffer_len, const char **desc);
33+
EUICC_API long euicc_derutil_convert_bin2long(const uint8_t *buffer, uint32_t buffer_len);
34+
EUICC_API int euicc_derutil_convert_long2bin(uint8_t *buffer, uint32_t *buffer_len, long value);
35+
EUICC_API int euicc_derutil_convert_bits2bin(uint8_t *buffer, uint32_t buffer_len, const uint32_t *bits,
36+
uint32_t bits_count);
37+
EUICC_API int euicc_derutil_convert_bits2bin_alloc(uint8_t **buffer, uint32_t *buffer_len, const uint32_t *bits,
38+
uint32_t bits_count);
39+
EUICC_API int euicc_derutil_convert_bin2bits_str(const char ***output, const uint8_t *buffer, int buffer_len,
40+
const char **desc);

euicc/es10a.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include "euicc_export.h"
23

34
#include "euicc.h"
45

@@ -7,7 +8,8 @@ struct es10a_euicc_configured_addresses {
78
char *rootDsAddress;
89
};
910

10-
int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, struct es10a_euicc_configured_addresses *address);
11-
int es10a_set_default_dp_address(struct euicc_ctx *ctx, const char *smdp);
11+
EUICC_API int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx,
12+
struct es10a_euicc_configured_addresses *address);
13+
EUICC_API int es10a_set_default_dp_address(struct euicc_ctx *ctx, const char *smdp);
1214

13-
void es10a_euicc_configured_addresses_free(struct es10a_euicc_configured_addresses *address);
15+
EUICC_API void es10a_euicc_configured_addresses_free(struct es10a_euicc_configured_addresses *address);

euicc/es10b.h

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include "euicc_export.h"
23

34
#include <stdint.h>
45

@@ -123,35 +124,41 @@ struct es10b_operation_id {
123124
struct es10b_operation_id *next;
124125
};
125126

126-
int es10b_prepare_download_r(struct euicc_ctx *ctx, char **b64_PrepareDownloadResponse,
127-
struct es10b_prepare_download_param *param,
128-
struct es10b_prepare_download_param_user *param_user);
129-
int es10b_load_bound_profile_package_r(struct euicc_ctx *ctx, struct es10b_load_bound_profile_package_result *result,
130-
const char *b64_BoundProfilePackage);
131-
int es10b_get_euicc_challenge_r(struct euicc_ctx *ctx, char **b64_euiccChallenge);
132-
int es10b_get_euicc_info_r(struct euicc_ctx *ctx, char **b64_EUICCInfo1);
133-
int es10b_authenticate_server_r(struct euicc_ctx *ctx, uint8_t **transaction_id, uint32_t *transaction_id_len,
134-
char **b64_AuthenticateServerResponse, struct es10b_authenticate_server_param *param,
135-
struct es10b_authenticate_server_param_user *param_user);
136-
int es10b_cancel_session_r(struct euicc_ctx *ctx, char **b64_CancelSessionResponse,
137-
struct es10b_cancel_session_param *param);
138-
139-
void es10b_prepare_download_param_free(struct es10b_prepare_download_param *param);
140-
void es10b_authenticate_server_param_free(struct es10b_authenticate_server_param *param);
141-
142-
int es10b_prepare_download(struct euicc_ctx *ctx, const char *confirmationCode);
143-
int es10b_load_bound_profile_package(struct euicc_ctx *ctx, struct es10b_load_bound_profile_package_result *result);
144-
int es10b_get_euicc_challenge_and_info(struct euicc_ctx *ctx);
145-
int es10b_authenticate_server(struct euicc_ctx *ctx, const char *matchingId, const char *imei);
146-
int es10b_cancel_session(struct euicc_ctx *ctx, enum es10b_cancel_session_reason reason);
147-
148-
int es10b_list_notification(struct euicc_ctx *ctx, struct es10b_notification_metadata_list **notificationMetadataList);
149-
int es10b_retrieve_notifications_list(struct euicc_ctx *ctx, struct es10b_pending_notification *PendingNotification,
150-
unsigned long seqNumber);
151-
int es10b_remove_notification_from_list(struct euicc_ctx *ctx, unsigned long seqNumber);
152-
153-
void es10b_notification_metadata_list_free_all(struct es10b_notification_metadata_list *notificationMetadataList);
154-
void es10b_pending_notification_free(struct es10b_pending_notification *PendingNotification);
155-
156-
int es10b_get_rat(struct euicc_ctx *ctx, struct es10b_rat **ratList);
157-
void es10b_rat_list_free_all(struct es10b_rat *ratList);
127+
EUICC_API int es10b_prepare_download_r(struct euicc_ctx *ctx, char **b64_PrepareDownloadResponse,
128+
struct es10b_prepare_download_param *param,
129+
struct es10b_prepare_download_param_user *param_user);
130+
EUICC_API int es10b_load_bound_profile_package_r(struct euicc_ctx *ctx,
131+
struct es10b_load_bound_profile_package_result *result,
132+
const char *b64_BoundProfilePackage);
133+
EUICC_API int es10b_get_euicc_challenge_r(struct euicc_ctx *ctx, char **b64_euiccChallenge);
134+
EUICC_API int es10b_get_euicc_info_r(struct euicc_ctx *ctx, char **b64_EUICCInfo1);
135+
EUICC_API int es10b_authenticate_server_r(struct euicc_ctx *ctx, uint8_t **transaction_id, uint32_t *transaction_id_len,
136+
char **b64_AuthenticateServerResponse,
137+
struct es10b_authenticate_server_param *param,
138+
struct es10b_authenticate_server_param_user *param_user);
139+
EUICC_API int es10b_cancel_session_r(struct euicc_ctx *ctx, char **b64_CancelSessionResponse,
140+
struct es10b_cancel_session_param *param);
141+
142+
EUICC_API void es10b_prepare_download_param_free(struct es10b_prepare_download_param *param);
143+
EUICC_API void es10b_authenticate_server_param_free(struct es10b_authenticate_server_param *param);
144+
145+
EUICC_API int es10b_prepare_download(struct euicc_ctx *ctx, const char *confirmationCode);
146+
EUICC_API int es10b_load_bound_profile_package(struct euicc_ctx *ctx,
147+
struct es10b_load_bound_profile_package_result *result);
148+
EUICC_API int es10b_get_euicc_challenge_and_info(struct euicc_ctx *ctx);
149+
EUICC_API int es10b_authenticate_server(struct euicc_ctx *ctx, const char *matchingId, const char *imei);
150+
EUICC_API int es10b_cancel_session(struct euicc_ctx *ctx, enum es10b_cancel_session_reason reason);
151+
152+
EUICC_API int es10b_list_notification(struct euicc_ctx *ctx,
153+
struct es10b_notification_metadata_list **notificationMetadataList);
154+
EUICC_API int es10b_retrieve_notifications_list(struct euicc_ctx *ctx,
155+
struct es10b_pending_notification *PendingNotification,
156+
unsigned long seqNumber);
157+
EUICC_API int es10b_remove_notification_from_list(struct euicc_ctx *ctx, unsigned long seqNumber);
158+
159+
EUICC_API void
160+
es10b_notification_metadata_list_free_all(struct es10b_notification_metadata_list *notificationMetadataList);
161+
EUICC_API void es10b_pending_notification_free(struct es10b_pending_notification *PendingNotification);
162+
163+
EUICC_API int es10b_get_rat(struct euicc_ctx *ctx, struct es10b_rat **ratList);
164+
EUICC_API void es10b_rat_list_free_all(struct es10b_rat *ratList);

0 commit comments

Comments
 (0)